Day-16 面向对象03 类与类之间的关系
一、類與類之間的依賴關系
我用著你,但是你不屬于我,這種關系是最弱的,比如,公司和雇員之間,對于正式員工,肯定要簽訂勞動合同,還得小心伺候著,但是如果是兼職,那無所謂,需要了你就來,不需要你就可以拜拜了,這里的兼職(臨時工)就屬于依賴關系
1 class Elphant: 2 def __init__(self, name): 3 self.name = name 4 5 def open(self, ref): 6 print("大象要開門了. 默念三聲. 開!") 7 # 由外界傳遞進來一個冰箱, 讓冰箱開門. 這時. 大象不用背著冰箱到處跑. 8 # 類與類之間的關系也就不那么的緊密了. 換句話說. 只要是有open_door()方法的對象. 都可以接收運行 9 ref.open_door() 10 11 12 def close(self, ref): 13 print("大象要關門了. 默念三聲. 關!") 14 pass 15 16 def take(self): 17 print("鉆進去") 18 19 20 class Refrigerator: 21 22 def open_door(self): 23 print("冰箱門被打開了") 24 def close_door(self): 25 print("冰箱門被關上了") 26 27 28 # 造冰箱 29 r = Refrigerator() 30 31 # 造大象 32 el = Elphant("神奇的大象") 33 el.open(r) # 注意. 此時是把一個冰箱作為參數傳遞進去了. 也就是說. 大象可以指定任何一個冰箱. 34 el.take() 35 el.close(r)大象進冰箱
?
二、關聯關系、組合關系、聚合關系
1.關聯關系:兩種事物必須是互相關聯的,但是在某些特殊情況下是可以更改和更換的。此時類與類之間的關系是最輕的
2.聚合關系:屬于關聯關系中的一種特例,側重點是xxx和xxx聚合成xxx,各自有各自的聲明周期,比如電腦,電腦里有CPU,硬盤,內存等等,電腦掛了,CPU還是好的,還是完整的個體。
3.組合關系:屬于關聯關系中的一種特例,寫法上差不多,組合關系比聚合還要緊密,比如人的大腦,心臟,各個器官,這些器官組合成一個人,這是人如果掛了,其他東西也跟著掛了。
?
三、繼承關系
在面向對象的世界中存在著繼承關系. 我們現實中也存在著這樣的關系. 我們說過. x是一種y, 那x就可以繼承y。
首先, 類名和對象默認是可以作為字典的key的
class Foo:def __init__(self):passdef method(self):pass# __hash__ = Noneprint(hash(Foo)) print(hash(Foo()))
既然可以hash. 那就是說字典的key可以是對象或者類
dic = {} dic[Foo] = 123 dic[Foo()] = 456 print(dic) # {<class '__main__.Foo'>: 123, <__main__.Foo object at 0x103491550>: 456}
接下來. 我們來繼續研究繼承上的相關內容. 在本節中主要研究一下self. 記住. 不管方法之
間如何進行調用. 類與類之間是何關系. 默認的self都是訪問這個方法的對象.
class Base:def __init__(self, num):self.num = numdef func1(self):print(self.num)self.func2()def func2(self):print("Base.func2")class Foo(Base):def func2(self):print("Foo.func2")obj = Foo(123) obj.func1() # 123 Foo.func2 func1是Base中的 func2是子類中的
總結:self在訪問方法的順序:永遠先找自己的,自己的找不到再找父類的
?
四、類中的特殊成員
什么是特殊成員呢?__init__就是一個特殊的成員,說白了,帶雙下劃線的那一坨,這些方法在特殊的場景的時候會被自動的執行,比如:
1.__init__ 初始化方法
2.__str__ 打印對象時,默認輸出該方法返回值
3.__new__ 構造方法
4.__enter__和__exit__ with 對象 as 變量 會自動執行該方法
5.__hash__?打印對象哈希值
6.__add__ 實現加法操作
7.__mul__ 實現乘法操作
8.__bool__ 實現真假值操作
9.__iter__ 用于迭代器
10.__del__ 釋放內存
11.__getitem__ 用于索引操作,如字典,獲取數據
12.__setitem__?用于索引操作,如字典,設置數據
13.__delitem__?用于索引操作,如字典,刪除數據
14.__getslice__ 用于切片操作,如列表,獲取數據
15.__setslice__ 用于切片操作,如列表,設置數據
16.__delslice__?用于切片操作,如列表,刪除數據
17.__eq__ 判斷對象的值是否相等
創建對象的真正步驟:
首先,在執行類名()的時候,系統會自動先執行__new__()來開辟內存,此時新開辟出來的內存區域為空的,緊隨其后,系統自動調用__init__()來完成對象的初始化工作,按照時間軸來算。
1.加載類
2.開辟內存(__new__)
3.初始化(__init__)
4.使用對象干xxxxx
轉載于:https://www.cnblogs.com/minusone/p/9931950.html
總結
以上是生活随笔為你收集整理的Day-16 面向对象03 类与类之间的关系的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 关于明星吸毒,大家怎么看?
 - 下一篇: 《感鹤》第四句是什么