类的高级内置方法

简介

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# coding:utf-8

# __str__ 如果定义了该函数,print实例化对象时会返回该函数return的信息。一般是类的描述性信息。

# __getattr__ 调用不存在的函数,返回该方法定义的信息。

# __setattr__ 拦截当前类中不存在的属性和值。

# __call__ 将一个实例化的类当成一个函数来使用。

class Test():
def __str__(self):
return 'this is a test class'
def __getattr__(self,key): # key 就是不存在的那个函数名。
print('这个key:{}并不存在。'.format(key))
def __setattr__(self,key,value):
print(key,value)
self.__dict__[key] = value
print(self.__dict__)
def __call__(self,a):
print('__call__ has being start')
print(a)

t = Test()
print(t)
t.a
t.name = '小木' # name 和小木属于类中不存在的属性和值。
t('dewei')
print('____________________\n')


# 目的 使用链式调用 t.a.b.c

class Test2():
def __init__(self,attr=None):
self.__attr = attr

def __call__(self,name):
print('key is {}'.format(self.__attr))
return name

def __getattr__(self,key):
if self.__attr:
key = '{}.{}'.format(self.__attr,key)
else:
key = key
print(key)
return Test2(key) # 递归。等于把上一个找不着的函数当atrr了。

t = Test2()
name = t.a.b.c('小木')
print(name)