Python为instance / class属性提供了许多可能性,例如:
class A(object):
def __init__(self):
self.foo = "hello"
a = A()
有多种方法可以访问/更改self.foo
:
a.foo
a.__dict__['foo']
a.__get__
和a.__set__
,当然有两种是预先定义的方法。a.__getattribute__
__getattr__
和__setattr__
在阅读源代码时,我总是迷失在他们的最终访问顺序之外?当我使用a.foo
时,我如何知道实际调用哪个方法/属性?
答案 0 :(得分:8)
bar = a.foo
...
a.__getattribute__('foo')
a.__dict__['foo']
foo
上定义,则.__get__()
A
。然后将返回的值分配给bar
。
a.foo = bar
...
a.__getattribute__('foo')
a.__dict__['foo']
foo
' .__set__(bar)
。答案 1 :(得分:6)
我发现this great post有关于对象/类属性查找的详细说明。
对象属性查找:
假设Class
是该类,而instance
是Class
的实例,则评估instance.foobar
大致相当于此:
Class.__getattribute__
(tp_getattro
)的类型位置。默认设置为:
Class.__dict__
是否有foobar
项是数据描述符?
Class.__dict__['foobar'].__get__(instance, Class)
的结果。 instance.__dict__
中是否有'foobar'
个项目?
instance.__dict__['foobar']
。Class.__dict__
是否有foobar
项不是数据描述符[9]?
Class.__dict__['foobar'].__get__(instance, klass)
的结果。 [6] Class.__getattr__
,请致电Class.__getattr__('foobar')
。有一个插图图片:
如果感兴趣,请查看原始博客,其中提供了有关python类,属性查找和元类的出色解释。