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.感谢您的帮助.
你的问题是双下划线在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.__value在B实际设置名为成员变量_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)