jtxs0000 发表于 2020-8-21 12:15:44

super()函数怎么用

搞了好久都弄不明白super()要怎么用{:10_266:}



class Cat:
   
    def __init__(self):
      self.name = "我是一只慵懒的小猫咪"

    def display(self):
      print(self.name)

class Dog(Cat):

    def __init__(self):            
      self.name = "我是一只很凶的大狼狗"
      

    def display(self):   
            
      print(self.name)
      

class Pig(Dog):

    def __init__(self):      
      self.name = "我是一只很快就会饿的小猪"

    def display(self):
      
      print(self.name)
      
      

if __name__ == "__main__":
    ds = Pig()
    ds.display()


super()放在不同位置打印出来不同的结果,请问大佬要在哪个位置放super()函数才会全部打印出来{:10_262:}

Twilight6 发表于 2020-8-21 12:24:47

本帖最后由 Twilight6 于 2020-8-21 12:29 编辑


直接放 super 只会重复打印三次‘我是一只很快就会饿的小猪’ ,因为 name 参数只有在实例化 Pig 类的时候才赋值了,你后续 super 调用父类方法还是打印之前你初始化的 name

参考代码:

class Cat:

    def __init__(self):
      self.name = "我是一只慵懒的小猫咪"

    def display(self):
      print(self.name)


class Dog(Cat):

    def __init__(self):
      self.name = "我是一只很凶的大狼狗"

    def display(self):
      print(self.name)
      super().display()


class Pig(Dog):

    def __init__(self):
      self.name = "我是一只很快就会饿的小猪"

    def display(self):
      print(self.name)
      super().display()


if __name__ == "__main__":
    ds = Pig()
    ds.display()
输出结果:
我是一只很快就会饿的小猪
我是一只很快就会饿的小猪
我是一只很快就会饿的小猪

而你想打印三个不同的name ,需要先执行 __init__ 重新初始化下 self.name ,参考代码:

class Cat:

    def __init__(self):
      self.name = "我是一只慵懒的小猫咪"

    def display(self):
      print(self.name)


class Dog(Cat):

    def __init__(self):
      self.name = "我是一只很凶的大狼狗"

    def display(self):
      print(self.name)
      super().__init__()
      super().display()

class Pig(Dog):

    def __init__(self):
      self.name = "我是一只很快就会饿的小猪"

    def display(self):
      print(self.name)
      super().__init__()
      super().display()

if __name__ == "__main__":
    ds = Pig()
    ds.display()

输出结果:
我是一只很快就会饿的小猪
我是一只很凶的大狼狗
我是一只慵懒的小猫咪


也可以这样调用实例后的对象方法:

class Cat:

    def __init__(self):
      self.name = "我是一只慵懒的小猫咪"

    def display(self):
      print(self.name)


class Dog(Cat):

    def __init__(self):
      self.name = "我是一只很凶的大狼狗"

    def display(self):
      print(self.name)
      Cat().display()


class Pig(Dog):

    def __init__(self):
      self.name = "我是一只很快就会饿的小猪"

    def display(self):
      print(self.name)
      Dog().display()


if __name__ == "__main__":
    ds = Pig()
    ds.display()

输出结果:
我是一只很快就会饿的小猪
我是一只很凶的大狼狗
我是一只慵懒的小猫咪

sunrise085 发表于 2020-8-21 12:26:54

本帖最后由 sunrise085 于 2020-8-21 12:30 编辑

看看这个精华帖
你这个程序super放在那里一个都不会全部打印出来吧。。。。
这几个类中的成员变量名一样,
若初始化的时候调用super,会将原来的覆盖;
若在执行display的时候调用super,打印出来的也都是同一个name

楼上的方法应该不是你想要的,因为他那种写法,相当于又创建了一个父类的对象   Dog().display() 这是创建了Dog的对象,再调用该对象的display函数。

sunrise085 发表于 2020-8-21 12:32:12

本帖最后由 sunrise085 于 2020-8-21 12:40 编辑

Twilight6 发表于 2020-8-21 12:24
直接放 super 只会重复打印三次‘我是一只很快就会饿的小猪’ ,因为 name 参数只有在实例化 Pig 类的 ...

你的这种写法应该不是楼主想要的
这种写法实际上是在子类的display函数中创建了一个父类的对象,然后再用父类对象调用其display函数
Dog().display()这是先创建了一个Dog对象,然后调用display函数。
Cat().display()   也是如此

Twilight6 发表于 2020-8-21 12:33:32

本帖最后由 Twilight6 于 2020-8-21 12:34 编辑

sunrise085 发表于 2020-8-21 12:32
你的这种写法应该不是楼主想想要的
这种写法实际上是在子类的display函数中创建了一个父类的对象,然后 ...



在我代码前面不是说明了吗,是直接调用实例后对象方法,而且我的第二个代码已经满足楼主的意思了

聂嘉辉 发表于 2020-8-21 13:11:08

class Cat:

    def __init__(self):
      self.name = "我是一只慵懒的小猫咪"

    def display(self):
      print(self.name)


class Dog(Cat):

    def __init__(self):
      self.name = "我是一只很凶的大狼狗"

    def display(self):
      print(self.name)
      super().__init__()
      super().display()

class Pig(Dog):

    def __init__(self):
      self.name = "我是一只很快就会饿的小猪"

    def display(self):
      print(self.name)
      super().__init__()
      super().display()

if __name__ == "__main__":
    ds = Pig()
    ds.display()

jtxs0000 发表于 2020-8-21 13:20:38

谢谢各位大佬,原来是我少调用了   super().display()了
页: [1]
查看完整版本: super()函数怎么用