【问题标题】:Confusing inheritance with super keyword in python? [closed]在 python 中将继承与 super 关键字混淆? [关闭]
【发布时间】:2013-12-16 12:43:16
【问题描述】:

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

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类中的代码?

请解释一下上面的代码?

【问题讨论】:

  • 这其中的哪一部分让您感到惊讶?您没有表明任何您希望发生的不同情况。
  • 对不起@user2357112。我已经编辑了我的代码。
  • 什么?你是在问为什么,如果你不调用 super(),Python 不调用 super()?
  • 您是否对为什么不自动调用继承方法感到困惑?
  • 即使先调用超类方法(它们不在这里),你为什么期望结果会有所不同?它将设置__namename,然后读取__namenamename 是最终的返回值。

标签: python inheritance superclass


【解决方案1】:

示例 1

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

示例 2

当您在父子对象中都有同名的方法时,如果您使用子对象调用该方法,则将首先搜索子对象,如果找到匹配项,它将返回/执行它取决于进行的操作。基本上子对象中的方法会影响父对象中的方法。

【讨论】:

    【解决方案2】:

    在示例 #1 中,您不会覆盖 getNamesetName 的默认 (Animal) 实现。

    • 所以你先把set这个名字改成“fida”,然后你get这个名字(存储在self.__name中)和print这个名字。
    • 那么你对“Marcus”做同样的事情

    在示例#2 中,您将使用 Dog 类中的实现覆盖 getNamesetName 的默认实现。

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

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

    【讨论】:

      【解决方案3】:

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

      如果您省略对super() 的调用,super() 将不会自动调用基类的继承方法。必须明确使用。 这是 Python 的方式

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-28
        • 2015-06-07
        • 2018-05-30
        • 1970-01-01
        • 2021-11-23
        • 1970-01-01
        • 2020-04-21
        • 1970-01-01
        相关资源
        最近更新 更多