繼承
??????? 一個(gè)類型繼承另一個(gè)類型髓堪,當(dāng)前類型就會(huì)擁有另一個(gè)類型的公共的屬性和方法,達(dá)到代碼的重復(fù)使用的目的。
繼承的語法:
class 類型(被繼承的類型):
????????? pass
繼承中出現(xiàn)的術(shù)語:
父類:被繼承的類,也稱為基類髓考、超類
子類:當(dāng)前類,也稱為派生類
子類繼承父類弃酌,體現(xiàn)的時(shí)A is a B的關(guān)系
子類繼承父類氨菇,就可以使用父類中所有的公開的屬性和方法
class God(object):
????????? def __init__(self,name):
?????????????????????? self.name = name
????????? def eat(self):
?????????????????????? print("風(fēng)餐露宿")
class LZS(God):
???????????def drink(self):
????????????????????? print("喝酒")
g = God("天篷")
#g.drink()
g.eat()
l = LZS("魯智深")
l.eat()
l.drink()
繼承鏈
A繼承B儡炼,B繼承C,C繼承D
A直接繼承了B查蓉,間接繼承了C,D乌询;此時(shí)A創(chuàng)建的對(duì)象,可以同時(shí)使用B,C,D中所有公開的屬性和方法
class A:
?????? def eat(self):
?????????????? print("吃飯1236")
class B(A):
??????? def play(self):
?????????????? print("玩兒123456789")
class C(B):
??????? def sleep(self):
??????????????? print("睡12345678")
class D(C):
pass
d = D()
d.eat()
d.sleep()
d.play()
多繼承
python中豌研,一個(gè)類型妹田,可以同時(shí)繼承多個(gè)類型,同時(shí)擁有所有繼承類型的所有公開的屬性和方法
備注:在進(jìn)行代碼設(shè)計(jì)的過程中聂沙,可能會(huì)出現(xiàn)多繼承,所以盡量不要在父類中定義相同名稱的屬性或者方法
備注2:如果父類中出現(xiàn)了相同名稱的屬性和方法初嘹,在使用的時(shí)候子類調(diào)用時(shí)會(huì)優(yōu)先繼承優(yōu)先調(diào)用及汉。
# 定義一個(gè)基礎(chǔ)類
class Person(object):
??????????def __init__(self, name):
?????????????????????? self.name = name
class Student(Person):
????????? def eat(self):
????????????????????? print("吃食堂12345678")
??????????def respect(self):
???????????????????? print("尊師重道")
class Son(Person):
?????????? def eat(self):
???????????????????? print("吃大餐。屯烦。坷随。。驻龟。温眉。。翁狐。")
????????? def fealty(self):
???????????????????? print("尊老愛幼")
class User(Student,Son):
????????? pass
u = User("qwertyui")
u.respect()
u.fealty()
# 吃飯
# 如果繼承的多個(gè)父類中类溢,出現(xiàn)了相同的屬性和方法,就會(huì)執(zhí)行方法或?qū)傩缘乃阉?/p>
# 過程露懒,搜索到對(duì)應(yīng)的屬性和方法闯冷,立即執(zhí)行,中斷搜索
# 屬性和方法的搜索過程懈词,可以通過 類型.__mro__魔法屬性查看
# 優(yōu)先繼承蛇耀,優(yōu)先執(zhí)行
u.eat()
print(User.__mro__)
方法重寫:
子類在自己類中重新定義父類中已經(jīng)存在的方法,在執(zhí)行該方法時(shí)坎弯,如果子類中沒有重寫就直接調(diào)用父類的方法纺涤,如果子類重寫了該方法,就直接調(diào)用子類重寫的方法抠忘!
擴(kuò)展:子類中撩炊,訪問父類的屬性和方法:
class User(Person):
def __init__(self, name, age):
# 直接通過父類的類名稱調(diào)用父類的屬性和方法
Person.__init__(name, age)
# 通過super()來調(diào)用父類的屬性和方法
super().__init__(name, age)
'''
方法重載:偽方法重載~出現(xiàn)在一個(gè)類的不用函數(shù)
方法重寫:子類中崖疤,重新定義父類已經(jīng)存在的方法
子類-父類土砂,兩個(gè)實(shí)現(xiàn)了繼承關(guān)系的類型遍搞,才會(huì)有方法重寫
如果方法進(jìn)行了重寫嘉汰,在子類對(duì)象執(zhí)行這個(gè)方法時(shí)優(yōu)先執(zhí)行重寫的方法
如果子類沒有重寫這個(gè)方法斟冕,在執(zhí)行時(shí)就會(huì)執(zhí)行從父類繼過來的方法
'''
class Person(object):
?????? def eat(self,food):
????????????????? print("吃11111111%s" % food)
class Man(Person):
????????def eat(self,food):
??????????????? print("吃222222222%s" % food)
p = Person()
p.eat("紅燒肉")
m = Man()
m.eat("烤鴨")