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__)