python - python属性的get和set顺序是什么?

标签 python class attributes metaprogramming instance-variables

Python为我们提供了很多实例/类属性的可能性,例如:

class A(object):
    def __init__(self):
        self.foo = "hello"

a = A()

有很多方法可以访问/更改self.foo的值:

  1. 直接访问a.foo
  2. 内部字典 a.__dict__['foo']
  3. 获取和设置a.__get__a.__set__,当然有两个是预定义的方法。
  4. getattribute a.__getattribute__
  5. __getattr____setattr__
  6. 也许更多。

在阅读源代码时,我总是搞不清楚它们的最终访问顺序是什么?当我使用 a.foo 时,我如何知道哪个方法/属性将被实际调用?

最佳答案

我发现了 this great post对对象/类属性查找有详细的解释。

对于对象属性查找:

假设 Class 是类,instanceClass 的实例,评估 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')

这里有一张插图:

enter image description here

如果有兴趣请查看原始博客,其中对 python 类、属性查找和元类进行了出色的解释。

关于python - python属性的get和set顺序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30961069/

相关文章:

python导入函数不导入程序

ruby - 在 Ruby 中, "class ClassName < Base"行在此上下文中意味着什么

java - Java 中的 servlet

asp.net-mvc - FilterAttribute 顺序不起作用

jquery - 在 IE 中使用 jQuery 获取属性

python - 使用 Selenium 登录雅虎,缺少点击

python - 在进程之间共享不断发展的字典

python - 如何将按 x、y、z 坐标排序的 pandas 数据框转换为 numpy 数组列表?

objective-c - Objective-C 中的类是对象吗?

java - Selenium Web 驱动程序 - 如何同时查找具有标签名称和类名称的元素