python oop多态性

ale*_*sel 3 python oop polymorphism

我无法理解为什么这段代码:

class A(object):
    def __init__(self):
        self.__value = 1
    def get_value(self):
        return self.__value

class B(A):
    def __init__(self):
        A.__init__( self )
        self.__value = 2

b = B()

print b.get_value()
Run Code Online (Sandbox Code Playgroud)

给出1,但不是2.感谢您的帮助.

Nic*_*tin 7

你的问题是双下划线在python中是特殊的,并创建一些隐私(不强制执行,但它会破坏名称,这是影响你的地方).您应该在不使用双下划线命名变量的情况下重新创建此项.此外,您应该使用super而不是A.__init__显式调用:

>>> class A(object):
...     def __init__(self):
...             self.value = 1
...     def get_value(self):
...             return self.value
... 
>>> class B(A):
...     def __init__(self):
...             super(B, self).__init__()
...             self.value = 2
... 
>>> b = B()
>>> b.get_value()
2
Run Code Online (Sandbox Code Playgroud)

如果您不想阅读引用的文档,请参阅更多细节:

如果您阅读上面"特殊"的链接,该段落将描述您使用时发生的内部名称修改__.简短的回答是A.get_value()回报_A__value,并设置self.__valueB实际设置名为成员变量_B__value,这意味着A.get_value()永远看不到它.

你可以通过真正做一些真正的事情来证明这一点:

>>> class A(object):
...     def get_value(self):
...             return self._B__value
... 
>>> class B(A):
...     def __init__(self):
...             self.__value = 2
... 
>>> b = B()
>>> b.get_value()
2
Run Code Online (Sandbox Code Playgroud)

  • @scr:不.需要当前的课程. (4认同)