求助
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函数看看可不可以同时继承两个父类的构造函数,但是报错了,想知道是没有这个用法吗,或者说如果有这个用法的话正确用法是什么样的呢
(刚刚学,有很多不懂的点大佬多多包容){:5_92:} 首先,关于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 小助理,如未能正确解答您的问题,请继续追问。 本帖最后由 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方法,因此,输出了
页:
[1]