__getattr__ 与动态属性
直接上代码
>>> class Test(object): ... def __getattr__(self,attr_name): ... setattr(self, attr_name, '(default)') ... return self.attr_name ... >>> t=Test() >>> t.name '(default)' >>> t.age '(default)' >>> t.name='smith' >>> t.name 'smith' >>> t.age=38 >>> t.age 38
是不是感觉节操碎了一地?
原理剖析:
默认:
class_object.attr --> 去 class_object.__dict__中寻找 attr的属性 --(没找着)---> class.__dict__ ----(没找者) ----> parent_class.__dict__---(没找着)----> 抛出异常 AttrbiuteError
但当class定义了自己的__getattr__(而不是__getattribute__, 慎重写)时,寻找逻辑是这样的:
class_object.attr --> 去 class_object.__dict__中寻找 attr的属性 --(没找着)---> class.__dict__ ----(没找者) ----> 调用class的__getattr__来动态“生成”属性(返回对应属性的值,没有return则为None)
转载请注明来源:http://www.cnblogs.com/Tommy-Yu/p/5480975.html
参考:http://m.jb51.net/article/59908.htm
谢谢!