在python中使用super关键字混淆继承?

时间:2013-12-16 12:43:17

标签: python inheritance superclass

我对继承和超级感到困惑。在这里我写了一些代码,请看下面,

class Animal(object):
    """docstring for Animal"""
    __name, __weight, __sound = ["",0,1]
    def __init__(self):
        super(Animal, self).__init__()

    def setName(self, newName):
        self.__name = newName
    def getName(self):
        return self.__name

class Dog(Animal):
    """docstring for Dog"""
    def __init__(self):
        super(Dog, self).__init__()
    def setName(self, name):
        self.name = "here is "+ name
    def getName(self):
        return self.name


if __name__ == "__main__":
    fida = Dog()
    fida.setName('fida')


    def changeObjectName(obj):
       obj.setName("Marcus")

    print fida.getName()
    changeObjectName(fida)
    print fida.getName()

这里我观察两个案例输出,

1当我像这样评论Dog类中的代码时,

class Dog(Animal):
    """docstring for Dog"""
    def __init__(self):
        super(Dog, self).__init__()
    # def setName(self, name):
    #   self.name = "here is "+ name
    # def getName(self):
    #   return self.name

我得到了这样的输出:

fida
Marcus

从上面的输出中我观察了从超类调用的方法(即动物)

2没有评论Dog类中的代码,

class Dog(Animal):
    """docstring for Dog"""
    def __init__(self):
        super(Dog, self).__init__()
    def setName(self, name):
        self.name = "here is "+ name
    def getName(self):
        return self.name

我得到了这样的输出,

here is fida
here is Marcus

从上面的输出我观察到从子类调用的方法(即;狗)

为什么setName没有在超类中调用Dog类中的代码?

请解释上面的代码?

3 个答案:

答案 0 :(得分:1)

示例1

当您使用实际对象中不存在的成员对象时,Python会继承继承阶梯并查找匹配的成员。如果发现它将根据执行的操作返回/执行它。如果在任何父母中也找不到它,它将失败并出现错误。

示例2

如果在父项和子项中都有一个具有相同名称的方法,并且如果使用子对象调用该方法,则将首先搜索子对象,如果找到匹配项,则它将返回/执行它,具体取决于操作执行。基本上,子对象中的方法会遮蔽父对象中的方法。

答案 1 :(得分:0)

在示例#1中,您覆盖AnimalgetName的默认(setName)实现。

  • 因此您首先set将名称改为“fida”,然后get名称(存储在self.__name中)和print名称。
  • 然后你用“Marcus”
  • 做同样的事
在示例#2中,您将getNamesetName的默认实现与Dog类中的实现重叠。

  • 调用setName()现在将名称设置为“here is fida”(您将self.name设置为"here is"+name),然后将get设置为名称(存储在self.name)和print它。
  • 重复“Marcus”

覆盖类的成员函数就是这样做:覆盖(替换)函数;它不会神奇地调用所有父类。

答案 2 :(得分:0)

我认为你对super()做什么和不做什么感到困惑。

如果省略对super()的调用,

super()将不会自动调用基类的继承方法。必须使用明确 Tis是Python的方式