python面向对象多态性

python面向对象多态性,python,oop,polymorphism,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()

我不明白为什么这个代码:

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()

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

您的问题是python中使用了双下划线,并创建了一些隐私(不是强制的,但它会破坏名称,这正是影响您的原因)。您应该在不使用双下划线命名变量的情况下重新创建该变量。此外,您应该使用
super
而不是显式调用
A.\uuu init\uuuu

>>> 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
如果不想阅读参考文档,请参阅更多详细信息:

如果您阅读了上面“special”上的链接,则该段落描述了使用
\uuu
时发生的内部名称损坏。简单的回答是
A.get\u value()
返回
\u A\u value
,并在
B
中设置
self.\u value
实际上设置了名为
\u B\u value
的成员变量,这意味着
A.get\u value()
从未看到它

你可以通过做一些真正令人难以置信的事情来证明这一点:


self.\uu value=1
创建“private”字段,该字段以这种方式对儿童不可见

对“受保护”字段使用单下划线

例如,
self.\u值=1

当您创建名称以双下划线开头的字段时,Python会在添加到对象的
\uuu dict\uuu
之前对其进行一些修改:

>>> class A(object):
...     def __init__(self):
...         self.__value = 1
...     def get_value(self):
...         return self.__value
...
>>> A().__dict__
{'_A__value': 1}

这就是为什么
\u value
字段在子对象中不可见的原因。

Python既没有“private”也没有“protected”;这两个都只是约定,编译器会根据其中一个约定进行操作。@Ignacio当然,这就是为什么我将这些词括在引号中。你的意思不是超级(A,self)吗?\uuuu init\uuuu()而不是超级(B,self)。\uuu init\uuuuu()?@scr:Nope。它使用当前的类。我知道删除下划线会得到2,但为什么它会返回1呢?如果
super(B,self)。\uu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。为什么需要
super()
?对此有很长的解释。
>>> class A(object):
...     def __init__(self):
...         self.__value = 1
...     def get_value(self):
...         return self.__value
...
>>> A().__dict__
{'_A__value': 1}