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

章節(jié)
問答
課簽
筆記
評(píng)論
占位
占位

Python中的多態(tài)

類具有繼承關(guān)系,并且子類類型可以向上轉(zhuǎn)型看做父類類型,如果我們從 Person 派生出 Student和Teacher ,并都寫了一個(gè)who() 方法:

class Person(object):
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender
    def who(self):
        return 'I am a Person, my name is %s' % self.name

class Student(Person):
    def __init__(self, name, gender, score):
        super(Student, self).__init__(name, gender)
        self.score = score
    def who(self):
        return 'I am a Student, my name is %s' % self.name

class Teacher(Person):
    def __init__(self, name, gender, course):
        super(Teacher, self).__init__(name, gender)
        self.course = course
    def who(self):
        return 'I am a Teacher, my name is %s' % self.name

接著,我們分別把不同類型的who()函數(shù)結(jié)果打印出來:

p = Person('Tim', 'Male')
s = Student('Bob', 'Male', 88)
t = Teacher('Alice', 'Female', 'English')

運(yùn)行結(jié)果:

I am a Person, my name is Tim
I am a Student, my name is Bob
I am a Teacher, my name is Alice

這種行為稱為多態(tài)。從定義上來講,Student和Teacher都擁有來自父類Person繼承的who()方法,以及自己定義的who()方法。但是在實(shí)際調(diào)用的時(shí)候,會(huì)首先查找自身的定義,如果自身有定義,則優(yōu)先使用自己定義的函數(shù);如果沒有定義,則順著繼承鏈向上找。

class Boss(Person):
    def __init__(self, name, gender,company):
        super(Boss, self).__init__(name, gender)
        self.company = company

b = Boss('Bob', 'Male', 'Alibaba')
b.who() # ==> I am a Person, my name is Bob

在Boss的定義類,沒有定義who方法,所以會(huì)順著繼承鏈向上找到父類的who方法并且調(diào)用。

Python中的多重繼承

除了從一個(gè)父類繼承外,Python允許從多個(gè)父類繼承,稱為多重繼承。多重繼承和單繼承沒有特別大的差異,只是在括號(hào)內(nèi)加入多個(gè)需要繼承的類的名字即可。

class A(object):
    def __init__(self, a):
        print ('init A...')
        self.a = a

class B(A):
    def __init__(self, a):
        super(B, self).__init__(a)
        print ('init B...')

class C(A):
    def __init__(self, a):
        super(C, self).__init__(a)
        print ('init C...')

class D(B, C):
    def __init__(self, a):
        super(D, self).__init__(a)
        print ('init D...')

多重繼承的繼承鏈就不是一棵樹了,它像這樣:

從上圖可知,A類被繼承了兩次,那么A的__init__()方法,是否會(huì)被調(diào)用兩次呢?

?>>> d = D('d')
init A...
init C...
init B...
init D...

實(shí)踐證明,在多重繼承里,A雖然被繼承了兩次,但是__init__()的方法只調(diào)用一次。

多重繼承的目的是從兩種繼承樹中分別選擇并繼承出子類,以便組合功能使用。
舉個(gè)例子,Python的網(wǎng)絡(luò)服務(wù)器有TCPServer、UDPServer、UnixStreamServer、UnixDatagramServer,而服務(wù)器運(yùn)行模式有 多進(jìn)程ForkingMixin 和 多線程ThreadingMixin兩種。
要?jiǎng)?chuàng)建多進(jìn)程模式的 TCPServer:

class MyTCPServer(TCPServer, ForkingMixin)
    pass

要?jiǎng)?chuàng)建多線程模式的 UDPServer:

class MyUDPServer(UDPServer, ThreadingMixin):
    pass

如果沒有多重繼承,要實(shí)現(xiàn)上述所有可能的組合需要 4x2=8 個(gè)子類。

任務(wù)

已知類Student、Teacher繼承Person類,技能類BasketballMixin、FootballMixin繼承SkillMixin類,請(qǐng)通過多重繼承,分別定義“會(huì)打籃球的學(xué)生”和“會(huì)踢足球的老師”。

?不會(huì)了怎么辦

參考答案:

class Person(object):
    pass

class Student(Person):
    pass

class Teacher(Person):
    pass

class SkillMixin(object):
    pass

class BasketballMixin(SkillMixin):
    def skill(self):
        return 'basketball'

class FootballMixin(SkillMixin):
    def skill(self):
        return 'football'

class BStudent(BasketballMixin, Student):
    pass

class FTeacher(FootballMixin, Teacher):
    pass

s = BStudent()
print(s.skill())

t = FTeacher()
print(t.skill())
||

提問題

寫筆記

公開筆記
提交
||

請(qǐng)驗(yàn)證,完成請(qǐng)求

由于請(qǐng)求次數(shù)過多,請(qǐng)先驗(yàn)證,完成再次請(qǐng)求

加群二維碼

打開微信掃碼自動(dòng)綁定

您還未綁定服務(wù)號(hào)

綁定后可得到

  • · 粉絲專屬優(yōu)惠福利
  • · 大咖直播交流干貨
  • · 課程更新,問題答復(fù)提醒
  • · 賬號(hào)支付安全提醒

收藏課程后,能更快找到我哦~

使用 Ctrl+D 可將課程添加到書簽

邀請(qǐng)您關(guān)注公眾號(hào)
關(guān)注后,及時(shí)獲悉本課程動(dòng)態(tài)

舉報(bào)

0/150
提交
取消
全部 精華 我要發(fā)布
全部 我要發(fā)布
最熱 最新
只看我的

手記推薦

更多

本次提問將花費(fèi)2個(gè)積分

你的積分不足,無法發(fā)表

為什么扣積分?

本次提問將花費(fèi)2個(gè)積分

繼續(xù)發(fā)表請(qǐng)點(diǎn)擊 "確定"

為什么扣積分?