第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定

關(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)。這塊兒我比較疑惑。

正在回答

3 回答

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


0 回復(fù) 有任何疑惑可以回復(fù)我~

在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__方法:

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):??
????????#?顯式調(diào)用A的__init__方法??
????????A.__init__(self,?name,?age)??
????????#?顯式調(diào)用B的__init__方法??
????????B.__init__(self,?name,?sex,?height)??
??
#?創(chuàng)建C的實(shí)例??
c?=?C("Alice",?30,?"female",?165)??
print(c.name)??#?輸出:?Alice??
print(c.age)???#?輸出:?30??
print(c.sex)???#?輸出:?female??
print(c.height)?#?輸出:?165

在上面的例子中,類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__方法通常是更合適的選擇。


0 回復(fù) 有任何疑惑可以回復(fù)我~

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

class 本類名(父類名)

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

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

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

0 回復(fù) 有任何疑惑可以回復(fù)我~

舉報(bào)

0/150
提交
取消

關(guān)于多重繼承在子類的__init__方法中到底應(yīng)該調(diào)用哪個(gè)父類的__init__

我要回答 關(guān)注問題
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)