關(guān)于多重繼承在子類的__init__方法中到底應(yīng)該調(diào)用哪個(gè)父類的__init__
我想問下 假設(shè) C繼承了A和B? 其中A的init有兩個(gè)參數(shù),B的init有三個(gè)參數(shù),這幾個(gè)參數(shù)都沒有啥特別的關(guān)系,然后我在寫C的init函數(shù)的時(shí)候,里面的super應(yīng)該咋寫,到底以哪個(gè)父類的為準(zhǔn)。這塊兒我比較疑惑。
我想問下 假設(shè) C繼承了A和B? 其中A的init有兩個(gè)參數(shù),B的init有三個(gè)參數(shù),這幾個(gè)參數(shù)都沒有啥特別的關(guān)系,然后我在寫C的init函數(shù)的時(shí)候,里面的super應(yīng)該咋寫,到底以哪個(gè)父類的為準(zhǔn)。這塊兒我比較疑惑。
2023-10-08
舉報(bào)
2024-06-09
# 關(guān)于你這個(gè)情況,我嘗試了兩種理解方法,我自己稱為顯示調(diào)用和繼承式調(diào)用,具體代碼如下:
class Person(object):
? ? def __init__(self, name, gender):
? ? ? ? self.name = name
? ? ? ? self.gender = gender
class Student(Person):
? ? def __init__(self, name, gender, score):
? ? ? ? super(Student, self).__init__(name, gender)
? ? ? ? self.score = score
class Teacher(Person):
? ? def __init__(self, name, gender, course):
? ? ? ? super(Teacher, self).__init__(name, gender)
? ? ? ? self.course = course
class Skill(object):
? ? def __init__(self, sport):
? ? ? ? self.sport = sport
class PlayBasketball(Skill):
? ? def __init__(self, sport):
? ? ? ? super(PlayBasketball, self).__init__(sport)
class PlayFootball(Skill):
? ? def __init__(self, sport):
? ? ? ? super(PlayFootball, self).__init__(sport)
# 顯示地調(diào)用父類的init初始化方法
class StudentBasketball(PlayBasketball, Student):
? ? def __init__(self, name, gender, score, sport):
? ? ? ? Student.__init__(self, name, gender, score)
? ? ? ? PlayBasketball.__init__(self, sport)
? ? def can_play(self):
? ? ? ? return 'I am %s ,i am %s, i got score %s ,i can play%s' % (self.name, self.gender, self.score, self.sport)
# 顯示地調(diào)用父類的init初始化方法
class TeacherFootball(PlayFootball, Teacher):
? ? def __init__(self, name, gender, course, sport):
? ? ? ? Teacher.__init__(self, name, gender, course)
? ? ? ? PlayFootball.__init__(self, sport)
? ? def can_play(self):
? ? ? ? return 'I am %s ,i am %s,i teach %s ,i can play%s' % (self.name, self.gender, self.course, self.sport)
# 繼承式地調(diào)用父類的init初始化方法
class StudentPlayBasketball(PlayBasketball, Student):
? ? def __init__(self, name, gender, score, sport):
? ? ? ? super(StudentPlayBasketball, self).__init__(name, gender, score)
? ? ? ? super(StudentPlayBasketball, self).__init__(sport)
? ? def can_play(self):
? ? ? ? return 'I am %s ,i am %s, i got score %s ,i can play%s' % (self.name, self.gender, self.score, self.sport)
# 繼承式地調(diào)用父類的init初始化方法
class TeacherPlayFootball(PlayFootball, Teacher):
? ? def __init__(self, name, gender, course, sport):
? ? ? ? super(TeacherPlayFootball, self).__init__(name, gender, course)
? ? ? ? super(TeacherPlayFootball, self).__init__(sport)
? ? def can_play(self):
? ? ? ? return 'I am %s ,i am %s,i teach %s ,i can play%s' % (self.name, self.gender, self.course, self.sport)
student = StudentBasketball('Jason', 'Male', 98, 'Basketball')
teacher = TeacherFootball('Alice', 'Female', 'English', 'Football')
student1 = StudentBasketball('Jason', 'Male', 98, 'Basketball')
teacher2 = TeacherFootball('Alice', 'Female', 'English', 'Football')
print(student1.can_play())
print(teacher2.can_play())
2024-03-21
在Python中,當(dāng)類C繼承自類A和類B,并且A和B的
__init__
方法需要不同數(shù)量的參數(shù)時(shí),你需要在類C的__init__
方法中顯式地調(diào)用這兩個(gè)父類的__init__
方法。由于Python的super()
函數(shù)用于調(diào)用父類的方法,但它不會(huì)自動(dòng)處理不同數(shù)量的參數(shù)問題,因此你需要手動(dòng)調(diào)用每個(gè)父類的__init__
方法,并傳遞必要的參數(shù)。以下是一個(gè)例子,展示了如何在類C的
__init__
方法中調(diào)用類A和類B的__init__
方法:在上面的例子中,類C的
__init__
方法接受所有必要的參數(shù),然后分別調(diào)用類A和類B的__init__
方法。注意,這里我們直接調(diào)用了A和B的__init__
方法,而不是使用super()
。這是因?yàn)?code class="inline">super()用于調(diào)用當(dāng)前類在MRO(方法解析順序)中的下一個(gè)父類的方法,但它不會(huì)處理不同數(shù)量的參數(shù)問題。由于類A和類B的__init__
方法需要不同的參數(shù)集,直接調(diào)用它們是最直接和清晰的方式。如果你堅(jiān)持想要使用
super()
,那么你必須確保你的繼承結(jié)構(gòu)以及__init__
方法的參數(shù)設(shè)計(jì)允許這樣做。這通常意味著你需要設(shè)計(jì)一個(gè)統(tǒng)一的參數(shù)列表,這個(gè)列表可以包含所有父類__init__
方法所需的參數(shù)。然而,在你的情況下,由于參數(shù)之間沒有直接的關(guān)系,并且它們各自屬于不同的父類,這可能會(huì)變得非常復(fù)雜且不直觀。因此,直接調(diào)用每個(gè)父類的__init__
方法通常是更合適的選擇。2023-11-07
我所理解的格式是這樣的,希望對你有幫助:
class 本類名(父類名)
????del __init__(所有屬性(包括新屬性)):
????????super (本類名,self).__init__(父類擁有的屬性)
????????self.新屬性1 = 新屬性1