面向對象的特征——繼承
繼承是面向對象的重要特征之一,繼承是兩個類或者多個類之間的父子關系,子進程繼承了父進程的所有公有實例變量和方法。繼承實現了代碼的重用。重用已經存在的數據和行為,減少代碼的重新編寫,python在類名后用一對圓括號表示繼承關系, 括號中的類表示父類,如果父類定義了__init__方法,則子類必須顯示地調用父類的__init__方法,如果子類需要擴展父類的行為,可以添加__init__方法的參數。
繼承的語法:
class類型(被繼承的類型):
? ? ? pass
繼承中出現的術語:
父類:被繼承的類,也稱為基類、超類
子類:當前類,也稱為派生類
子類繼承父類,體現的時A is a B的關系
子類繼承父類,就可以使用父類中所有的公開的屬性和方法
繼承鏈
A繼承B,B繼承C,C繼承D
A直接繼承了B,間接繼承了C,D;此時A創建的對象,可以同時使用B,C,D中所有公開的屬性和方法
多繼承
python中,一個類型,可以同時繼承多個類型,同時擁有所有繼承類型的所有公開的屬性和方法
備注:在進行代碼設計的過程中,可能會出現多繼承,所以盡量不要在父類中定義相同名稱的屬性或者方法
備注2:如果父類中出現了相同名稱的屬性和方法,在使用的時候子類調用時會優先繼承優先調用。
繼承:可以通過類型和類型之間,進行關聯,實現繼承的關系
語法:
class 類型(被繼承的類型):
pass
此時,當前類型中,就繼承了被繼承的類型中公共的屬性和方法,繼承的兩個類型:父類,子類,子類是父類的類型? A is a B A是B類型
分析 A和B,誰繼承誰的關系。核心:A是B or B是A,那句話能說的通。子類繼承了父類,
子類中就可以使用父類中公共的屬性和方法同時,子類可以定義自己特有的屬性和方法每個對象都有一份,而且各個對象之間互不影響。每個對象都有一份,而且各個對象之間互不影響。
class God(object):
def __init__(self, name):
? ? ? ? ? self.name = name
def eat(self):
? ? ? ? ?print("風餐露宿...")
class LZS(God):
? ? ?def drink(self):
? ? ? ? ? ?print("喝花酒")
zhishen_lu = LZS("魯智深")
zhishen_lu.eat()
zhishen_lu.drink()
tianpeng = God("天蓬")
tianpeng.eat()
tianpeng.drink()
繼承鏈:就是一系列繼承關系,A 繼承了B? B繼承了C, C繼承了D,A間接繼承了B,C,D,A中,就可以使用B,C,D中所有公共屬性和公共方法
class A:
? ? ? def eat(self):
? ? ? ? ? ?print("吃飯")
class B(A):
? ? ?def play(self):
? ? ? ? ? ? print("游戲中...")
class C(B):
? ? ?def sleep(self):
print("休息休息")
class D(C):
? ?pass
d = D()
d.eat()
d.play()
d.sleep()
# 定義了一個基礎類
class Person(object):
? ? ? ? ?def __init__(self):
? ? ? ? ? self.name = "tom"
class Student(Person):
? ? ? ? ?def eat(self):
? ? ? ? ? ? ? ? print("吃食堂飯....")
def respect(self):
? ? ? ? ? print("尊師重道")
class Son(Person):
? ? ? ? ? def eat(self):
print("吃美食...")
def fealty(self):
? ? ? ?print("尊老愛幼")
# User類型,繼承了兒子類型、學生類型
# 同時擁有兒子類型和學生類型中所有的公共屬性和方法
class User(Son, Student):
? ? ? ? pass
# 創建對象
u = User()
# u是學生角色
u.respect()
# u是兒子角色
u.fealty()
# 吃飯
# 如果繼承的多個父類中,出現了相同的屬性和方法,就會執行方法或者屬性的搜索
# 過程,搜索到對應的屬性和方法,立即執行,中斷搜索
# 屬性和方法的搜索過程,可以通過? 類型.__mro__ 魔法屬性進行查看
# 優先繼承,優先執行
u.eat()
print(User.__mro__)# method from object
方法重寫:
子類在自己類中重新定義父類中已經存在的方法,在執行該方法時,如果子類中沒有重寫就直接調用父類的方法,如果子類重寫了該方法,就直接調用子類重寫的方法!
class Person:
? ? ? ? ?def eat(self, food):
? ? ? ? ? ? ? ? print("吃飯吃飯....吃%s" % food)
class Man(Person):
? ? ? ? ?def eat(self, food):
? ? ? ? ? print(">>>>>>>>>>餓肚肚,吃飯飯,吃%s" % food)
p = Person()
p.eat("魚香肉絲")
m = Man()
m.eat("烤全羊")