Python 为什么';这个超类在初始化期间是否在子类中运行方法?
为什么此代码不打印Python 为什么';这个超类在初始化期间是否在子类中运行方法?,python,oop,Python,Oop,为什么此代码不打印10 我希望超类调用子类中的\uuu init\u var方法 class A: def __init__(self): self.__init_var() def __init_var(self): self.var = 1 class B(A): def __init__(self): A.__init__(self) def __init_var(self): self.
10
我希望超类调用子类中的\uuu init\u var
方法
class A:
def __init__(self):
self.__init_var()
def __init_var(self):
self.var = 1
class B(A):
def __init__(self):
A.__init__(self)
def __init_var(self):
self.var = 10
print(B().var)
您使用两个初始下划线将方法命名为
\uuuu init\u var
,使其成为类私有方法。名称已损坏,以确保子类不会与其冲突。从:
。
类的私有名称。当在类定义的上下文中使用此类别中的名称时,会重新编写以使用损坏的形式,以帮助避免基类和派生类的“私有”属性之间的名称冲突 以及在: 私有名称混乱:当类定义中以文本形式出现的标识符以两个或多个下划线字符开头,而不是以两个或多个下划线结尾时,它被视为该类的私有名称。在为私有名称生成代码之前,会将其转换为更长的形式。转换将在名称前面插入类名,删除前导下划线并插入一个下划线。例如,出现在名为
Ham
的类中的标识符\uuu spam
将转换为\uham\uu spam
因此,A.\uuuu init\u var
被重命名为A.\uuu init\u var
,而A.\uu init\uuu()
被修改为调用A.\u A\uu init\u var()
。重命名的B.\u B\u init\u var()
方法从未被调用,因为它具有不同的名称:
>>> dir(A)
['_A__init_var', '__doc__', '__init__', '__module__']
>>> import dis
>>> dis.dis(A.__init__) # disassemble the bytecode for A.__init__
3 0 LOAD_FAST 0 (self)
3 LOAD_ATTR 0 (_A__init_var)
6 CALL_FUNCTION 0
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> dir(B)
['_A__init_var', '_B__init_var', '__doc__', '__init__', '__module__']
删除其中一个初始下划线,将其命名为\u init\u var
:
class A:
def __init__(self):
self._init_var()
def _init_var(self):
self.var = 11
class B(A):
def __init__(self):
A.__init__(self)
def _init_var(self):
self.var = 10
您使用两个初始下划线将方法命名为
\uuuu init\u var
,使其成为类私有方法。名称已损坏,以确保子类不会与其冲突。从:
。
类的私有名称。当在类定义的上下文中使用此类别中的名称时,会重新编写以使用损坏的形式,以帮助避免基类和派生类的“私有”属性之间的名称冲突 以及在: 私有名称混乱:当类定义中以文本形式出现的标识符以两个或多个下划线字符开头,而不是以两个或多个下划线结尾时,它被视为该类的私有名称。在为私有名称生成代码之前,会将其转换为更长的形式。转换将在名称前面插入类名,删除前导下划线并插入一个下划线。例如,出现在名为
Ham
的类中的标识符\uuu spam
将转换为\uham\uu spam
因此,A.\uuuu init\u var
被重命名为A.\uuu init\u var
,而A.\uu init\uuu()
被修改为调用A.\u A\uu init\u var()
。重命名的B.\u B\u init\u var()
方法从未被调用,因为它具有不同的名称:
>>> dir(A)
['_A__init_var', '__doc__', '__init__', '__module__']
>>> import dis
>>> dis.dis(A.__init__) # disassemble the bytecode for A.__init__
3 0 LOAD_FAST 0 (self)
3 LOAD_ATTR 0 (_A__init_var)
6 CALL_FUNCTION 0
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> dir(B)
['_A__init_var', '_B__init_var', '__doc__', '__init__', '__module__']
删除其中一个初始下划线,将其命名为\u init\u var
:
class A:
def __init__(self):
self._init_var()
def _init_var(self):
self.var = 11
class B(A):
def __init__(self):
A.__init__(self)
def _init_var(self):
self.var = 10