在python中将继承与super关键字混淆?

2024-04-25 16:43:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我把继承和超级混为一谈。我在这里写了一些代码,请看下面

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没有注释的狗类代码是这样的

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

从上述输出中,我观察到了从子类(即Dog)调用的方法

为什么setName不在没有注释的情况下从超类调用Dog类中的代码?你知道吗

以及

请解释上面的代码?你知道吗


Tags: 代码nameselfforhereinitisdef
3条回答

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

如果省略对super()的调用,super()将不会自动调用基类的继承方法。必须显式地使用它。这是Python的方式。你知道吗

例1

当使用实际对象中不存在的成员对象时,Python会沿着继承阶梯查找匹配的成员。如果有人发现了,它将根据执行的操作返回/执行它。如果在任何一个父母身上也找不到它,它就会出错。你知道吗

例2

如果父对象和子对象中有同名的方法,并且使用子对象调用该方法,则将首先搜索子对象,如果找到匹配项,则将根据执行的操作返回/执行该方法。基本上,子对象中的方法与父对象中的方法相比较。你知道吗

在示例#1中,您不是覆盖getNamesetName的默认(Animal)实现。你知道吗

  • 因此,首先set将名称命名为“fida”,然后get名称(存储在self.__name)和print名称。你知道吗
  • 然后你对“马库斯”也这么做

在示例#2中,您正在用Dog类中的实现重写getNamesetName的默认实现。你知道吗

  • 调用setName()现在将名称设置为“hereisfida”(您将self.name设置为"here is"+name),然后get名称(存储在self.name)和print它。你知道吗
  • 重复“马库斯”

重写一个类的成员函数只会这样做:重写(replace)这个函数;它不会神奇地调用所有父类。你知道吗

相关问题 更多 >