關于多重繼承在子類的__init__方法中到底應該調用哪個父類的__init__
我想問下 假設 C繼承了A和B? 其中A的init有兩個參數,B的init有三個參數,這幾個參數都沒有啥特別的關系,然后我在寫C的init函數的時候,里面的super應該咋寫,到底以哪個父類的為準。這塊兒我比較疑惑。
我想問下 假設 C繼承了A和B? 其中A的init有兩個參數,B的init有三個參數,這幾個參數都沒有啥特別的關系,然后我在寫C的init函數的時候,里面的super應該咋寫,到底以哪個父類的為準。這塊兒我比較疑惑。
2023-10-08
舉報
2024-06-09
# 關于你這個情況,我嘗試了兩種理解方法,我自己稱為顯示調用和繼承式調用,具體代碼如下:
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)
# 顯示地調用父類的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)
# 顯示地調用父類的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)
# 繼承式地調用父類的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)
# 繼承式地調用父類的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中,當類C繼承自類A和類B,并且A和B的
__init__
方法需要不同數量的參數時,你需要在類C的__init__
方法中顯式地調用這兩個父類的__init__
方法。由于Python的super()
函數用于調用父類的方法,但它不會自動處理不同數量的參數問題,因此你需要手動調用每個父類的__init__
方法,并傳遞必要的參數。以下是一個例子,展示了如何在類C的
__init__
方法中調用類A和類B的__init__
方法:在上面的例子中,類C的
__init__
方法接受所有必要的參數,然后分別調用類A和類B的__init__
方法。注意,這里我們直接調用了A和B的__init__
方法,而不是使用super()
。這是因為super()
用于調用當前類在MRO(方法解析順序)中的下一個父類的方法,但它不會處理不同數量的參數問題。由于類A和類B的__init__
方法需要不同的參數集,直接調用它們是最直接和清晰的方式。如果你堅持想要使用
super()
,那么你必須確保你的繼承結構以及__init__
方法的參數設計允許這樣做。這通常意味著你需要設計一個統一的參數列表,這個列表可以包含所有父類__init__
方法所需的參數。然而,在你的情況下,由于參數之間沒有直接的關系,并且它們各自屬于不同的父類,這可能會變得非常復雜且不直觀。因此,直接調用每個父類的__init__
方法通常是更合適的選擇。2023-11-07
我所理解的格式是這樣的,希望對你有幫助:
class 本類名(父類名)
????del __init__(所有屬性(包括新屬性)):
????????super (本類名,self).__init__(父類擁有的屬性)
????????self.新屬性1 = 新屬性1