内置函数的补充与getattrebuit & item系列

isinstance(g1,Room)判对象g1是否为Room类的实例化对象
issubclass(danyuan,Room)判断danyuan类是否为Room类的子类
__getattr__  __getattribute__
当只有前者的时候,如果实例化对象查找的属性或者方法不存在,前者会被触发,若二者同时存在,后者只要执行就触发,而前者不会,若要前者也能触发执行,需要在后者加入异常处理
具体代码实现如下:
 1 class Room:
 2     def __init__(self,num):
 3         self.name=num
 4 
 5     def __getattr__(self, item):
 6         print("11111111111111")
 7 
 8     def __getattribute__(self, item):
 9         print('22222222222222')
10         raise AttributeError("天王盖地虎")
11 
12 class danyuan(Room):
13     pass
14 
15 r1=Room('007')
16 # print(isinstance(g1,Room))
17 # print(issubclass(danyuan,Room))
18 
19 r1.name

 用法与__getattr__类似,attr是用对象点(s1.name=‘’tom‘’)属性赋值 而item则是通过字典方式赋值(s1['name']=‘’tom‘’)都会触发它们对应的机制

实现代码如下:

 1 class Work:
 2     def __getitem__(self, item):
 3         print('get被触发了')
 4         return self.__dict__[item]
 5 
 6     def __setitem__(self, key, value):
 7         print('set被触发了')
 8         self.__dict__[key]=value
 9 
10     def __delitem__(self, key):
11         print('del被触发了')
12         self.__dict__.pop(key)
13 
14 w1=Work()
15 print(w1.__dict__)
16 w1.name='tim'         #未用字典方式设置对象属性 不会触发__setitem__
17 print(w1.__dict__)
18 print('*************************')
19 w1['age']=18          #触发__setitem__
20 print(w1.__dict__)
21 del w1['name']        #触发__delitem__
22 print(w1.__dict__)
23 
24 print(w1['age'])      #触发__getitem__
25 
26 # w1['sex']='man'
27 # print(w1.__dict__)


原文地址:https://www.cnblogs.com/wen-kang/p/9250532.html