首页 > 解决方案 > 在类中访问 __attr 时,名称修饰如何工作?

问题描述

我知道 Python 中的数据处理一般是什么以及它的目的是什么,但是我想澄清一个微妙的方面。

假设我们有一个类:

class P:
    def __init__(self):
        self.x = 10
        self.__y = 20
    
    def get_y(self):
        return self.__y

p = P(); p.__dict__现在有了密钥_P__y,所以这是发生数据修改的地方。

不过,我的问题是,如果get_y没有__ykey in ,我们如何访问里面的属性__dict__

我有一个微弱的猜测,里面有一些魔法发生,__getattribute__然后,在进入AttributeError之后__getattr__

这种困惑让我觉得我对幕后的工作没有 100% 的了解__init__

标签: pythonoopname-mangling

解决方案


名称修改由编译器执行,而不是在运行时执行。具体来说,在 CPython 中,所有生成的字节码都假定属性的名称是_P__y,无论何时__y作为语句中的属性class或语句中定义的函数出现class

>>> import dis
>>> dis.dis(P)
Disassembly of __init__:
  3           0 LOAD_CONST               1 (10)
              2 LOAD_FAST                0 (self)
              4 STORE_ATTR               0 (x)

  4           6 LOAD_CONST               2 (20)
              8 LOAD_FAST                0 (self)
             10 STORE_ATTR               1 (_P__y)
             12 LOAD_CONST               0 (None)
             14 RETURN_VALUE

Disassembly of get_y:
  7           0 LOAD_FAST                0 (self)
              2 LOAD_ATTR                0 (_P__y)
              4 RETURN_VALUE

推荐阅读