1.__getattr__(self,item)
class Test: def __init__(self,name,age): self.name=name self.age=age def fangfa(self): print('this is a test') def __getattr__(self, item):#item的值就是对象的方法,在找不到对象是触发 print('can not get the %s' %item) p1=Test('yehaibin',18) print(p1.name) print('===>') print(p1.alex)
2.__delattr__
class Test: def __init__(self,name,age): self.name=name self.age=age def fangfa(self): print('this is a test') def __delattr__(self, item):#item的值就是对象的方法,在找不到对象是触发 print('I had delete this %s' %item) p1=Test('yehaibin',18) del p1.name#删除name属性时,出发delattr,打印 print(p1.__dict__)#输出p1的属性字典,发现name并没有实际被删除 print(p1.name) print('===>')
I had delete this name {'name': 'yehaibin', 'age': 18} yehaibin ===>
3. __setattr__
class Test: def __init__(self,name,age): self.name=name self.age=age def fangfa(self): print('this is a test') def __setattr__(self, key, value):#key就是属性,value就是属性的值 print(key,value) p1=Test('yehaibin',18) p1.alex='hahaha'#设置或者修改属性时调用setattr
4. 通过代码实现系统内置操作
class Test: def __init__(self,name,age): self.name=name self.age=age def __getattr__(self, item):#self是实例 return 'i can not find your item' def __setattr__(self, key, value):#如果直接使用self,key=value的话是进入无限递归,调用setattr方法 self.__dict__[key]=value def __delattr__(self, item): self.__dict__.pop(item) p1=Test('yehaibin',18) #查看方法 print(p1.alex)#输出getattr的返回值 #设置方法 p1.name='alex'#设置一个新属性 print(p1.name)#输出这个属性 print(p1.__dict__)#查看属性字典是否真的改变 #删除方法 del p1.age print(p1.__dict__)