【发布时间】:2017-10-30 16:14:44
【问题描述】:
我想我理解 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 之一。我在这里错过了什么?
【问题讨论】:
-
你错过了这正是它应该做的事情。在基础方法中,它将总是与
'_Base'混淆,以避免与同名的子类属性冲突。
标签: python inheritance