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}