python class 通过内置成员__dict__ 存储成员信息(字典)
我们可以通过重载__getattr__和__setattr__来拦截对成员的访问或者作出一些自己希望的行为
getattr 在访问对象访问类中不存在的成员时会自动调用,白话讲就是*.属性且属性不存在时调用,
setattr 方法用于在初始化对象属性或者修改对象属性的时候调用,即在类名.属性=值的时候就会调用__setattr__方法。
如 *.key = value 时调用。
具体看下面的例子
class A():
def __init__(self, ax, bx):
self.a = ax
self.b = bx
def f(self):
print(self.__dict__)
def __getattr__(self, name):
print("__getattr__", name)
def __setattr__(self, name, value):
print("__setattr__", name, value)
self.__dict__[name] = value
a = A(1, 2)
a.f()
a.x
a.x = 3
a.f()
输出结果
__setattr__ a 1
__setattr__ b 2
{'a': 1, 'b': 2}
__getattr__ x
__setattr__ x 3
{'a': 1, 'b': 2, 'x': 3}
分析:
a = A(1, 2)的时候执行了__init__函数,
self.a = ax 执行了 __setattr__函数 往内置__dict__字典里面写入了a:1
因此输出了结果 setattr a 1
self.b = bx 执行了 setattr__函数 往内置__dict__字典里面写入了b:2
因此输出了结果 setattr b 2
a.f()
显示__dict__字典信息。
显示结果 {‘a’: 1, ‘b’: 2}
a.x 因为x不在字典内,所以调用__getattr,显示 getattr x
a.x = 3 这里调用了__setattr__函数 往内置__dict__字典里面写入了x:3
所以显示结果:setattr x 3
a.f() 再次查询__dict__字典信息,显示结果:{‘a’: 1, ‘b’: 2, ‘x’: 3}