Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么';这个超类在初始化期间是否在子类中运行方法?_Python_Oop - Fatal编程技术网

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