Python为我们提供了很多实例/类属性的可能性,例如:
class A(object):
def __init__(self):
self.foo = "hello"
a = A()
有很多方法可以访问/更改self.foo
的值:
- 直接访问
a.foo
- 内部字典
a.__dict__['foo']
- 获取和设置
a.__get__
和a.__set__
,当然有两个是预定义的方法。 - getattribute
a.__getattribute__
__getattr__
和__setattr__
- 也许更多。
在阅读源代码时,我总是搞不清楚它们的最终访问顺序是什么?当我使用 a.foo
时,我如何知道哪个方法/属性将被实际调用?
最佳答案
我发现了 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 类、属性查找和元类进行了出色的解释。
关于python - python属性的get和set顺序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30961069/