python - 在类中访问 __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
没有__y
key in ,我们如何访问里面的属性__dict__
?
我有一个微弱的猜测,里面有一些魔法发生,__getattribute__
然后,在进入AttributeError
之后__getattr__
。
这种困惑让我觉得我对幕后的工作没有 100% 的了解__init__
。
解决方案
名称修改由编译器执行,而不是在运行时执行。具体来说,在 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
推荐阅读
- sql-server - Only one row user defined table can be passed to stored procedure
- botframework - Bot Framework Dialog Leakage Issue
- jakarta-ee - 如何分发这个架构?
- google-sheets - 如何使用来自另一个单元格的字符串引用另一张表?
- c# - 3D 向量和编程 - 一般问题
- python - 多对多,三个表相互关联(SqlAlchemy)
- r - R-文本分析-打印包含二元组的特定文本
- javascript - 数据表获取 ID
- c# - 安装后不显示 Windows 快捷方式
- excel - 通过 VBA 自动填充导致列清除