亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

關于多重繼承在子類的__init__方法中到底應該調用哪個父類的__init__

我想問下 假設 C繼承了A和B? 其中A的init有兩個參數,B的init有三個參數,這幾個參數都沒有啥特別的關系,然后我在寫C的init函數的時候,里面的super應該咋寫,到底以哪個父類的為準。這塊兒我比較疑惑。

正在回答

3 回答

# 關于你這個情況,我嘗試了兩種理解方法,我自己稱為顯示調用和繼承式調用,具體代碼如下:


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())


0 回復 有任何疑惑可以回復我~

在Python中,當類C繼承自類A和類B,并且A和B的__init__方法需要不同數量的參數時,你需要在類C的__init__方法中顯式地調用這兩個父類的__init__方法。由于Python的super()函數用于調用父類的方法,但它不會自動處理不同數量的參數問題,因此你需要手動調用每個父類的__init__方法,并傳遞必要的參數。

以下是一個例子,展示了如何在類C的__init__方法中調用類A和類B的__init__方法:

class?A:??
????def?__init__(self,?name,?age):??
????????self.name?=?name??
????????self.age?=?age??
??
class?B:??
????def?__init__(self,?name,?sex,?height):??
????????self.name?=?name??
????????self.sex?=?sex??
????????self.height?=?height??
??
class?C(A,?B):??
????def?__init__(self,?name,?age,?sex,?height):??
????????#?顯式調用A的__init__方法??
????????A.__init__(self,?name,?age)??
????????#?顯式調用B的__init__方法??
????????B.__init__(self,?name,?sex,?height)??
??
#?創建C的實例??
c?=?C("Alice",?30,?"female",?165)??
print(c.name)??#?輸出:?Alice??
print(c.age)???#?輸出:?30??
print(c.sex)???#?輸出:?female??
print(c.height)?#?輸出:?165

在上面的例子中,類C的__init__方法接受所有必要的參數,然后分別調用類A和類B的__init__方法。注意,這里我們直接調用了A和B的__init__方法,而不是使用super()。這是因為super()用于調用當前類在MRO(方法解析順序)中的下一個父類的方法,但它不會處理不同數量的參數問題。由于類A和類B的__init__方法需要不同的參數集,直接調用它們是最直接和清晰的方式。

如果你堅持想要使用super(),那么你必須確保你的繼承結構以及__init__方法的參數設計允許這樣做。這通常意味著你需要設計一個統一的參數列表,這個列表可以包含所有父類__init__方法所需的參數。然而,在你的情況下,由于參數之間沒有直接的關系,并且它們各自屬于不同的父類,這可能會變得非常復雜且不直觀。因此,直接調用每個父類的__init__方法通常是更合適的選擇。


0 回復 有任何疑惑可以回復我~

我所理解的格式是這樣的,希望對你有幫助:

class 本類名(父類名)

????del __init__(所有屬性(包括新屬性)):

????????super (本類名,self).__init__(父類擁有的屬性)

????????self.新屬性1 = 新屬性1

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

關于多重繼承在子類的__init__方法中到底應該調用哪個父類的__init__

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號