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: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:30 编辑
看看这个精华帖
你这个程序super放在那里一个都不会全部打印出来吧。。。。
这几个类中的成员变量名一样,
若初始化的时候调用super,会将原来的覆盖;
若在执行display的时候调用super,打印出来的也都是同一个name
楼上的方法应该不是你想要的,因为他那种写法,相当于又创建了一个父类的对象 Dog().display() 这是创建了Dog的对象,再调用该对象的display函数。 本帖最后由 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:34 编辑
sunrise085 发表于 2020-8-21 12:32
你的这种写法应该不是楼主想想要的
这种写法实际上是在子类的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)
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() 谢谢各位大佬,原来是我少调用了 super().display()了
页:
[1]