如果我有这个:
class foo(object):
@property
def bar(self):
return 0
f = foo()
如果可能的话,如何在不实际调用方法的情况下获得对 f.bar 的引用?
编辑添加:我想做的是编写一个函数来遍历 f 的成员并对它们做一些事情(什么不重要)。属性让我感到困惑,因为仅仅在 getattr() 中命名它们就会调用它们的 get() 方法。
原文由 kindall 发布,翻译遵循 CC BY-SA 4.0 许可协议
get_dict_attr
(下图)在给定对象的__dict__
attr
如果存在则返回关联值如果attr
不是__dict__
中的键,则搜索对象的 MRO__dict__
s。如果未找到密钥,则会引发AttributeError
。例如,
请注意,这与属性查找的正常规则非常不同。 For one thing, data-descriptors in
obj.__class__.__dict__
(descriptors with both__get__
and__set__
methods) normally have precedence over values inobj.__dict__
.在get_dict_attr
中,obj.__dict__
具有优先权。get_dict_attr
不尝试调用__getattr__
。最后,
get_dict_attr
仅适用于对象obj
它们是新型类的实例。尽管如此,我还是希望它能有所帮助。
这引用了属性
bar
:你看
bar
是Foo.__dict__
中的一个关键:所有属性都是描述符,这意味着它有一个
__get__
方法:您可以通过传递对象
f
和f
的类作为参数来调用该方法:我喜欢下面的图表。垂直线表示对象和对象的类之间的关系。
当你遇到这种情况时:
f.bar
导致调用b.__get__(f,Foo)
。这在 此处 详细解释。