類與類的關(guān)系
依賴關(guān)系
# 依賴關(guān)系: 將一個(gè)類的類名或者對象傳給另一個(gè)類的方法中. class Elephant: def __init__(self, name): self.name = name def open(self,r1): # print(ref1) print(f'{self.name}默念三聲: 芝麻開門') r1.open_door() def close(self): print('大象默念三聲:芝麻關(guān)門') class Refrigerator: def __init__(self, name): self.name = name def open_door(self): print(f'{self.name}冰箱門被打開了....') def close_door(self): print('冰箱門被關(guān)上了....') e1=Elephant('大象') r1=Refrigerator('海爾冰箱') e1.open(r1) #將一個(gè)類的類名或者對象傳給另一個(gè)類的方法中.產(chǎn)生了依賴關(guān)系
組合關(guān)系
組合: 將一個(gè)類的對象封裝成另一個(gè)類的對象的屬性.
class Boy: def __init__(self, name): self.name = name def meet(self, girl_friend=None): self.girl_friend = girl_friend # wu對象空間 : girl_friend : object對象 def have_diner(self): # self = wu這個(gè)對象空間 if self.girl_friend: print(f'{self.name}請年齡為:{self.girl_friend.age},姓名為{self.girl_friend.name}一起吃六塊錢的麻辣燙') self.girl_friend.shopping(self) # (self = wu對象空間) else: print('單身狗,吃什么吃') class Girl: def __init__(self, name, age): self.name = name self.age = age def shopping(self,boy_friend): print(f'{boy_friend.name},{self.name}一起去購物!') wu = Boy('吳超') flower = Girl('如花', 48) # 組合: 將一個(gè)類的對象封裝成另一個(gè)類的對象的屬性. wu.meet(flower) wu.have_diner()
繼承關(guān)系
繼承的優(yōu)點(diǎn):
1,增加了類的耦合性(耦合性不宜多,宜精)。
2,減少了重復(fù)代碼。
3,使得代碼更加規(guī)范化,合理化
繼承:可以分單繼承,多繼承。
單繼承
第一種:直接執(zhí)行
class Aniaml(object): type_name = '動物類' def __init__(self,name,sex,age): self.name = name self.age = age self.sex = sex def eat(self): print(self) print('吃東西') class Person(Aniaml): pass P1=Person('alex','男','18') # 實(shí)例化對象時(shí)必須執(zhí)行__init__方法,類中沒有,從父類找,父類沒有,從object類中找 P1.eat() # 先要執(zhí)行自己類中的eat方法,自己類沒有才能執(zhí)行父類中的方法。
第二種:子類和父類都有相同功能,都想執(zhí)行
class Aniaml(object): type_name = '動物類' def __init__(self,name,sex,age): self.name = name self.age = age self.sex = sex def eat(self): print('吃東西') class Person(Aniaml): def __init__(self,name,sex,age,mind): super().__init__(name,sex,age) # super.__init__ 自動幫你把self 傳給父類的__init__ self.mind = mind def eat(self): super().eat() print('%s 吃飯'%self.name) p1 = Person('春哥','laddboy',18,'有思想')
多繼承
class A: pass class B(A): pass class C(A): pass class D(B, C): pass class E: pass class F(D, E): pass class G(F, D): pass class H: pass class Foo(H, G): pass
新式類的多繼承
MRO是一個(gè)有序列表L,在類被創(chuàng)建時(shí)就計(jì)算出來。
通用計(jì)算公式為:
mro(Child(Base1,Base2)) = [ Child ] + merge( mro(Base1), mro(Base2), [ Base1, Base2] )(其中Child繼承自Base1, Base2)
如果繼承至一個(gè)基類:class B(A)
這時(shí)B的mro序列為
mro( B ) = mro( B(A) ) = [B] + merge( mro(A) + [A] ) = [B] + merge( [A] + [A] ) = [B,A]
如果繼承至多個(gè)基類:class B(A1, A2, A3 …)
這時(shí)B的mro序列
mro(B) = mro( B(A1, A2, A3 …) ) = [B] + merge( mro(A1), mro(A2), mro(A3) ..., [A1, A2, A3] ) = ...
計(jì)算結(jié)果為列表,列表中至少有一個(gè)元素即類自己,如上述示例[A1,A2,A3]。merge操作是C3算法的核心。
4.2.2. 表頭和表尾
表頭:
列表的第一個(gè)元素
表尾:
列表中表頭以外的元素集合(可以為空)
示例
列表:[A, B, C]
表頭是A,表尾是B和C
4.2.3. 列表之間的+操作
+操作:
[A] + [B] = [A, B]
(以下的計(jì)算中默認(rèn)省略)
merge操作示例:
如計(jì)算merge( [E,O], [C,E,F,O], [C] )
有三個(gè)列表 : ① ② ③1 merge不為空,取出第一個(gè)列表列表①的表頭E,進(jìn)行判斷
各個(gè)列表的表尾分別是[O], [E,F,O],E在這些表尾的集合中,因而跳過當(dāng)前當(dāng)前列表
2 取出列表②的表頭C,進(jìn)行判斷
C不在各個(gè)列表的集合中,因而將C拿出到merge外,并從所有表頭刪除
merge( [E,O], [C,E,F,O], [C]) = [C] + merge( [E,O], [E,F,O] )
3 進(jìn)行下一次新的merge操作 ......
以上知識點(diǎn)大家有沒有學(xué)會么?感謝大家對腳本之家的支持。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
