繼承
??????? 一個類型繼承另一個類型,當前類型就會擁有另一個類型的公共的屬性和方法,達到代碼的重復使用的目的。
繼承的語法:
class 類型(被繼承的類型):
????????? pass
繼承中出現(xiàn)的術語:
父類:被繼承的類,也稱為基類、超類
子類:當前類,也稱為派生類
子類繼承父類,體現(xiàn)的時A is a B的關系
子類繼承父類,就可以使用父類中所有的公開的屬性和方法
class God(object):
????????? def __init__(self,name):
?????????????????????? self.name = name
????????? def eat(self):
?????????????????????? print("風餐露宿")
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;此時A創(chuàng)建的對象,可以同時使用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中,一個類型,可以同時繼承多個類型,同時擁有所有繼承類型的所有公開的屬性和方法
備注:在進行代碼設計的過程中,可能會出現(xiàn)多繼承,所以盡量不要在父類中定義相同名稱的屬性或者方法
備注2:如果父類中出現(xiàn)了相同名稱的屬性和方法,在使用的時候子類調用時會優(yōu)先繼承優(yōu)先調用。
# 定義一個基礎類
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()
# 吃飯
# 如果繼承的多個父類中,出現(xiàn)了相同的屬性和方法,就會執(zhí)行方法或屬性的搜索
# 過程,搜索到對應的屬性和方法,立即執(zhí)行,中斷搜索
# 屬性和方法的搜索過程,可以通過 類型.__mro__魔法屬性查看
# 優(yōu)先繼承,優(yōu)先執(zhí)行
u.eat()
print(User.__mro__)
方法重寫:
子類在自己類中重新定義父類中已經存在的方法,在執(zhí)行該方法時,如果子類中沒有重寫就直接調用父類的方法,如果子類重寫了該方法,就直接調用子類重寫的方法!
擴展:子類中,訪問父類的屬性和方法:
class User(Person):
def __init__(self, name, age):
# 直接通過父類的類名稱調用父類的屬性和方法
Person.__init__(name, age)
# 通過super()來調用父類的屬性和方法
super().__init__(name, age)
'''
方法重載:偽方法重載~出現(xiàn)在一個類的不用函數(shù)
方法重寫:子類中,重新定義父類已經存在的方法
子類-父類,兩個實現(xiàn)了繼承關系的類型,才會有方法重寫
如果方法進行了重寫,在子類對象執(zhí)行這個方法時優(yōu)先執(zhí)行重寫的方法
如果子類沒有重寫這個方法,在執(zhí)行時就會執(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("烤鴨")