get_dict_attr(下图)
attr在给定对象的中查找
__dict__,如果存在则返回关联的值。如果
attr不是其中的关键,则搜索
__dict__对象的MRO
__dict__。如果找不到密钥,
AttributeError则引发。
def get_dict_attr(obj, attr): for obj in [obj] + obj.__class__.mro(): if attr in obj.__dict__: return obj.__dict__[attr] raise AttributeError
例如,
class Foo(object): x=1 def bar(self): pass @property def baz(self): return 0foo=Foo()print(get_dict_attr(foo,'x'))# 1print(get_dict_attr(foo,'bar'))# <unbound method Foo.bar>print(get_dict_attr(foo,'baz'))# <property object at 0xb77c0dc4>print(get_dict_attr(foo,'y'))# AttributeError
请注意,这与属性查找的常规规则有很大不同。一方面,中的数据描述符
obj.__class__.__dict__(带有
__get__和
__set__方法的描述符)通常优先于中的值
obj.__dict__。在中
get_dict_attr,
obj.__dict__具有优先权。
get_dict_attr不尝试致电
__getattr__。
最后,
get_dict_attr仅适用于
obj作为新样式类实例的对象。
不过,我希望这会有所帮助。
class Foo(object): @property def bar(self): return 0f = Foo()
这引用了属性
bar:
print(Foo.bar)# <property object at 0xb76d1d9c>
您看到的
bar是关键
Foo.__dict__:
print(Foo.__dict__['bar'])# <property object at 0xb775dbbc>
所有属性都是描述符,这意味着它具有
__get__方法:
print(Foo.bar.__get__)# <method-wrapper '__get__' of property object at 0xb76d7d74>
您可以通过传递object
f和
fas的类来调用方法:
print(Foo.bar.__get__(f,Foo))# 0
我喜欢下图。垂直线显示对象与对象的类之间的关系。
在这种情况下:
Foo B | Foo.__dict__={'bar':b}| B.__dict__={'__get__':...} || f `--------> b
f.bar使
b.__get__(f,Foo)被调用。
这将在此处详细说明。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)