1.__getattr__
class Foo: def __init__(self,name): self.name=name # def __getattr__(self, item): # print(‘你找的属性%s不存在‘%item) f1=Foo(‘alex‘) print(f1.name) #alex print(f1.age) #报错:AttributeError: ‘Foo‘ object has no attribute ‘age‘ #类Foo本身就有内置函数__getattr__,当在类中又定义了一个__getattr__时,则执行的是新定义的
2.__setattr__
# class Foo: # def __init__(self,name): # self.name=name # # def __setattr__(self, key, value): # print(‘执行__setattr__‘) # # f1=Foo(‘alex‘) # 执行__setattr__ # print(f1.__dict__) #{} # #执行了自己定义的__setattr__,并不会真正往字典属性里传值 #要求:往字典属性里传值,值必须是str类型 class Foo: def __init__(self,name): self.name=name def __setattr__(self, key, value): print(‘执行__setattr__‘) if type(value) is str: print(‘开始设置属性‘) # self.key=value #又触发__setattr__ self.__dict__[key]=value else: print(‘必须是字符串类型‘) f1=Foo(‘alex‘) # 执行__setattr__ f1.age=18 print(f1.__dict__) #{}
3.__delattr__
class Foo: def __init__(self,name): self.name=name def __delattr__(self, item): print(‘执行__delattr__‘) # f1.__dict__.pop(item) #这样才会真正的删除 f1=Foo(‘alex‘) f1.age=18 print(f1.__dict__) #{‘name‘: ‘alex‘, ‘age‘: 18} del f1.age #执行__delattr__ print(f1.__dict__) #{‘name‘: ‘alex‘, ‘age‘: 18}
原文:https://www.cnblogs.com/wuweixiong/p/10605829.html