鱼C论坛

 找回密码
 立即注册
查看: 1116|回复: 2

求助

[复制链接]
发表于 2024-1-31 16:43:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
class People:
    name = ''
    age = 0
    __weight = 0
    
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
        
    def speak(self):
        print("%s said: I am %d years old." %(self.name,self.age))
        
class Student(People):
    grade = ''
    
    def __init__(self,n,a,w,g):
        People.__init__(self,n,a,w)
        self.grade = 0
        
    def speak(self):
        print("%s said:I am %d years old and I am in Grade%d." %(self.name,self.age,self.grade))

class Speaker:
    topic = ''
    name = ''
    
    def __init__(self,n,t):
        self.name = n
        self.topic = t
        
    def speak(self):
        print("I am %s.I am a speaker and my topic is %s" %(self.name,self.topic))
        
class Sample01(Speaker,Student):
    a = ''
    
    def __init__(self,n,a,w,g,t):
        super().__init__()
        
test = Sample01('Tim',25,80,4,'Python')
test.speak()

思路:定义了学生类(继承了人类的属性和方法)和演讲者类,然后有一个子类继承学生类和演讲者类两个父类
想尝试用super函数看看可不可以同时继承两个父类的构造函数,但是报错了,想知道是没有这个用法吗,或者说如果有这个用法的话正确用法是什么样的呢
(刚刚学,有很多不懂的点大佬多多包容)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-31 16:44:08 | 显示全部楼层
首先,关于super函数的用法,它可以用来调用父类的构造函数,但是在你的代码中出现了一个错误。在Sample01类的构造函数中,你没有传递任何参数给super()函数,导致报错。正确的用法应该是将参数n和t传递给super()函数,如下所示:
super().__init__(n, t)

然而,由于Python多继承的特性,需要格外小心。你的代码中,Sample01类继承了Student类和Speaker类,而这两个类又分别继承了People类。这种继承关系可能会导致问题,并且可能出现不可预料的行为。

从你的代码来看,Student类中的speak方法已经覆盖了People类中的speak方法。换句话说,当你调用test.speak()时,只会执行Student类中的speak方法,而不会执行People类中的speak方法。同样的,如果你调用test.speak(),只会执行Speaker类中的speak方法,而不会执行Student类中的speak方法。

因此,尽管你的代码没有语法错误,但在设计上存在一些问题。如果你想要的是同时调用多个父类的构造函数,并且每个父类的方法都能被调用到,可能需要重新考虑你的继承关系和类的设计。

希望我的解释对你有帮助,如果还有其他问题,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-1 16:16:59 | 显示全部楼层
本帖最后由 zhangchenyvn 于 2024-2-1 16:33 编辑

正确用法

这里,把
super().__init__()
改成直接init就可以了~
class People:
    name = ''
    age = 0
    __weight = 0
    
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
        
    def speak(self):
        print("%s said: I am %d years old." %(self.name,self.age))
        
class Student(People):
    
    def __init__(self,n,a,w,g):
        People.__init__(self,n,a,w)
        self.grade = g #一个更改
        
    def speak(self):
        print("%s said:I am %d years old and I am in Grade%d." %(self.name,self.age,self.grade))

class Speaker:
    topic = ''
    name = ''
    
    def __init__(self,n,t):
        self.name = n
        self.topic = t
        
    def speak(self):
        print("I am %s.I am a speaker and my topic is %s" %(self.name,self.topic))

class Sample01(Speaker, Student):
    def __init__(self, n, a, w, g, t):
        Student.__init__(self, n, a, w, g)  # 显式调用 Student 的构造函数
        Speaker.__init__(self, n, t)        # 显式调用 Speaker 的构造函数

test = Sample01('Tim', 25, 80, 4, 'Python')
test.speak()  # 这将调用 Speaker 的 speak 方法,因为 Speaker 在继承顺序中排在前面
由于先init了student类,后init了speaker类,因此speaker类的speak方法就覆盖了student类的speak方法,因此,输出了
IMG_0307.jpeg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 19:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表