類與類的關係 依賴關係 組合關係 組合: 將一個類的對象封裝成另一個類的對象的屬性. 繼承關係 繼承的優點: 1,增加了類的耦合性(耦合性不宜多,宜精)。 2,減少了重覆代碼。 3,使得代碼更加規範化,合理化 繼承:可以分 單繼承,多繼承 。 單繼承 第一種:直接執行 第二種:子類和父類都有相同功能 ...
類與類的關係
依賴關係
# 依賴關係: 將一個類的類名或者對象傳給另一個類的方法中.
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('大象默念三聲:芝麻關門')
class Refrigerator:
def __init__(self, name):
self.name = name
def open_door(self):
print(f'{self.name}冰箱門被打開了....')
def close_door(self):
print('冰箱門被關上了....')
e1=Elephant('大象')
r1=Refrigerator('海爾冰箱')
e1.open(r1) #將一個類的類名或者對象傳給另一個類的方法中.產生了依賴關係
組合關係
組合: 將一個類的對象封裝成另一個類的對象的屬性.
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這個對象空間
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)
# 組合: 將一個類的對象封裝成另一個類的對象的屬性.
wu.meet(flower)
wu.have_diner()
繼承關係
繼承的優點:
1,增加了類的耦合性(耦合性不宜多,宜精)。
2,減少了重覆代碼。
3,使得代碼更加規範化,合理化
繼承:可以分單繼承,多繼承。
單繼承
第一種:直接執行
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')
# 實例化對象時必須執行__init__方法,類中沒有,從父類找,父類沒有,從object類中找
P1.eat()
# 先要執行自己類中的eat方法,自己類沒有才能執行父類中的方法。
第二種:子類和父類都有相同功能,都想執行
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是一個有序列表L,在類被創建時就計算出來。
通用計算公式為:
mro(Child(Base1,Base2)) = [ Child ] + merge( mro(Base1), mro(Base2), [ Base1, Base2] )(其中Child繼承自Base1, Base2)
如果繼承至一個基類:class B(A)
這時B的mro序列為
mro( B ) = mro( B(A) )
= [B] + merge( mro(A) + [A] )
= [B] + merge( [A] + [A] )
= [B,A]
如果繼承至多個基類:class B(A1, A2, A3 …)
這時B的mro序列
mro(B) = mro( B(A1, A2, A3 …) )
= [B] + merge( mro(A1), mro(A2), mro(A3) ..., [A1, A2, A3] )
= ...
計算結果為列表,列表中至少有一個元素即類自己,如上述示例[A1,A2,A3]。merge操作是C3演算法的核心。
4.2.2. 表頭和表尾
表頭:
列表的第一個元素
表尾:
列表中表頭以外的元素集合(可以為空)
示例
列表:[A, B, C]
表頭是A,表尾是B和C
4.2.3. 列表之間的+操作
+操作:
[A] + [B] = [A, B]
(以下的計算中預設省略)
---------------------
merge操作示例:
如計算merge( [E,O], [C,E,F,O], [C] )
有三個列表 : ① ② ③
1 merge不為空,取出第一個列表列表①的表頭E,進行判斷
各個列表的表尾分別是[O], [E,F,O],E在這些表尾的集合中,因而跳過當前當前列表
2 取出列表②的表頭C,進行判斷
C不在各個列表的集合中,因而將C拿出到merge外,並從所有表頭刪除
merge( [E,O], [C,E,F,O], [C]) = [C] + merge( [E,O], [E,F,O] )
3 進行下一次新的merge操作 ......
---------------------