什么是「;“自我”;Python中的对象?

什么是「;“自我”;Python中的对象?,python,Python,我不理解以下Python代码中的“Self”对象: >>> class Ancestor( object ): def __init__( self ): self.name = "Ancestor" def getName( self ): return self.name >>> class Base1( Ancestor ): def __init__( self ): self

我不理解以下Python代码中的“Self”对象:

>>> class Ancestor( object ):
    def __init__( self ):
        self.name = "Ancestor"
    def getName( self ):
        return self.name


>>> class Base1( Ancestor ):
    def __init__( self ):
        self.name = "Base1"
        super( Base1, self ).__init__( )
    def getName( self ):
        return self.name


>>> class Base2( Base1 ):
    def __init__( self ):
        self.name = "Base2"
        super( Base2, self ).__init__( )
    def getName( self ):
        return self.name
    def getB1Name( self ):
        return super( Base2, self ).getName( )


>>> b2 = Base2( )
>>> b2.getName( )
'Ancestor'
>>> b2.getB1Name( )
'Ancestor'

我无法理解结果。我原以为b2.getName()的结果是“Base2”,b2.getB1Name()的结果是“Base1”

当调用
super
函数时,基本上是跳入
祖先
类的构造函数并在那里执行代码。在构造函数中,将名称设置为
“祖先”
,覆盖基类中的新名称

如果调用每个构造函数中的第一行
super
,它应该返回正确的名称


但是,请注意,
B2
中的
getB1Name
函数将始终返回字符串
“Base2”
——变量
name
被简单地覆盖,并且不会以任何方式被“隐藏”


您可以使用双下划线变量,这将自动进行一些名称更改,以便保留“阴影”行为,但一般来说,更干净的解决方案是只使用不同的变量名称,并设计代码,这样就不需要同一属性的两个不同版本浮动。

self
指的是实例,而不是类。您只有一个实例,因此
self
的所有用法都引用同一个对象。在
Base2.\uuuu init\uuuu
中,您可以设置此对象的名称。然后调用
super
,调用
Base1.\uuu init\uuuu
,在同一对象上设置新名称,覆盖旧名称


如果你真的需要,你可以用它来实现你想要的。

先调用
super
仍然无法达到他期望的效果。无论调用方法的顺序如何,如果使用的是
self
,则该属性只能得到一个值。它可以是层次结构中的最低值或最高值,但根据调用的方法,不会得到不同的值。是的,没错。一开始我没有看到额外的方法——我主要是看构造函数。谢谢,这就是我想要的解释