gpt4 book ai didi

python - 使用双下划线继承类属性

转载 作者:行者123 更新时间:2023-12-05 01:18:04 25 4
gpt4 key购买 nike

我想我理解 python 中“名称修改”的概念,但我可能错过了一些东西。看看下面的代码:

#!/usr/bin/env python

class Base(object):
__data = "Base"

@classmethod
def func(cls):
return "Class name is {}, data is {}".format(cls.__name__, cls.__data)


class A(Base):
__data = "A"


class B(A):
__data = "B"


print Base.func()
print A.func()
print B.func()

这里是我得到的输出:

Class name is Base, data is Base
Class name is A, data is Base
Class name is B, data is Base

现在,我了解到对于每个类,类属性的实际名称都被修改为 _<Class name>__data .因此,例如,对于 Base 它将是 _Base__data , 对于 A 它将是 _A__data

我的问题是,在func里面它正确识别了继承类(Base、A 和 B)的名称,但是 cls.__data总是导致 cls._Base__data .这是为什么?我的意思是,如果 __name__是 A 或 B,那么我知道我在 A 或 B 类中,所以我期望 cls.__data分别是A或B之一。我在这里缺少什么?

最佳答案

你不是“失踪”,相反,你只是“发现”了名称修改的作用:它是为了确保方法中带有双下划线的变量将始终看到与该方法在同一类中定义的属性, 并且不在其子类中。

如果您只是想使用在每个子类中被重写的属性,那是所有其他属性的正常行为,但对于以两个下划线为前缀的属性。

因此,发生的事情是 func 中使用的 .__data 名称本身在编译时被破坏为 _base__data

OrderedDict

Python 的 collections.OrderedDict 有一个额外的陷阱:Python 提供了一个纯 Python 实现,它使用 __ 作为它的“私有(private)属性”,如上所述,但也有一个本地代码实现在 C 中,它的私有(private)结构不会暴露给 Python。

collections 模块以这些行结束 OrderedDict 代码块:

try:
from _collections import OrderedDict
except ImportError:
# Leave the pure Python version in place.
pass

也就是说:普通的“collections.OrderedDict”是用C写的,有很多不透明的结构,不能被子类利用。

访问 Python 定义的 OrderedDict 的唯一方法是通过删除 _collections.OrderedDict 属性(在 _collections 中,而不是 collections 模块),然后重新加载 collections 模块。

如果你这样做,并实例化一个有序的字典,私有(private)数据结构可以是这样的:


from imp import reload
import _collections, collections
backup = _collections.OrderedDict
del _collections.OrderedDict
collections = reload(collections)
PyOrderedDict = collections.OrderedDict
_collections.OrderedDict = backup
a = PyOrderedDict()
dir(a)

Out[xx]:
['_OrderedDict__hardroot',
'_OrderedDict__map',
'_OrderedDict__marker',
'_OrderedDict__root',
'_OrderedDict__update',
'__class__',
'__contains__',
'__delattr__',
...
]

关于python - 使用双下划线继承类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47019802/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com