代码:
#!/usr/bin/env python #! -*- coding:utf-8 -*- class A(object): def __setattr__(self, key, value): self.__dict__[key] = value def __getattr__(self, name): return "xxx" obj = A()
执行操作的代码:
代码1:
print(obj.__dict__)
结果:
{} # 空字典
代码2:
print(obj.name)
结果:
xxx
代码3:
obj.name = 'BBB' print(obj.__dict__) print(obj.name) print(obj.xxx)
结果:
{'name': 'BBB'} BBB xxx
总结:
1、当我们第一次获取obj.__dict__的结果是为空的字典。
2、当我们获取对象的某个属性的时候,会先在整个类中找,如过没有则去__getattr__方法里面找,并返回__getattr__中的属性。
3、当我们操作代码obj.name=’BBB’后,此时在类中会自动调用__setattr__方法;所以此时我们再打印obj.__dict__的时候结果会出现我们设置的属性名和属性对应的值组成的字典。
为总结的第二点再次举例说明:
当类中有我们要获取的属性的时候
class A(object): name = "123" def __setattr__(self, key, value): self.__dict__[key] = value def __getattr__(self, name): return "xxx" obj = A() print(obj.__dict__) print(obj.name)
结果:
{} 123
说明:
此时我们在类中定义了name属性,当我们通过对象获取类中的某个属性的时候,会先在整个类中找,如果有则返回对应的属性,没有则去__getattr__中找并返回的对应属性
当类中没有我们要的属性:
class A(object): def __setattr__(self, key, value): self.__dict__[key] = value def __getattr__(self, name): return "xxx" obj = A() print(obj.__dict__) print(obj.name)
结果:
{} xxx
验证当类中没有对应的属性的时候,会去__getattr__方法中找:
class A(object): def __setattr__(self, key, value): self.__dict__[key] = value def __getattr__(self, name): name = "123" return name obj = A() print(obj.__dict__) print(obj.name)
结果:
{} 123
问题:如果要获取的属性这个类中都没,而且__getattr__返回的是一个变量名,那结果会是怎样的?
class A(object): def __setattr__(self, key, value): self.__dict__[key] = value def __getattr__(self, name): return name obj = A() print(obj.name)
结果:
name
问题:__getattr__方法中 return 指定的值时,我们获取类中没有的属性,结果怎样?
class A(object): def __setattr__(self, key, value): self.__dict__[key] = value def __getattr__(self, name): return "ddd" obj = A() print(obj.rrr)
结果:
ddd
对总结第三点再次说明:
当对类中设置和修改属性的时候,类中会自动调用__setattr__方法。