一 . 組合
1 . 什么是組合
? ? 組合值的是某一個對象擁有一個屬性,該屬性的值是另外一個類的對象
class Foo:
????pass
class Bar:
????pass
obj=Foo()
obj.attr=Bar()
obj.xxx
obj.attr.yyy
2 . 為何要用組合
? ? 通過為某一個對象添加屬性(屬性的值是另外一個類的對象)的方式,可以間接地將兩個類關聯/整合/組合到一起
從而減少代碼冗余
class Foo1:
????pass
class Foo2:
????pass
class Foo3:
????pass
class Bar:
????pass
obj_from_bar=Bar()
obj1=Foo1()
obj2=Foo2()
obj3=Foo3()
obj1.attr1=obj_from_bar
obj2.attr2=obj_from_bar
obj3.attr3=obj_from_bar
3 . 如何用組合
二 . 多態
1 . 什么是多態
? ? 多態值的是同一種/類事物的不同形態
2 . 為何要用多態
????多態性:在多態的背景下,可以在不用考慮對象具體類型的前提下而直接使用對象
????多態性的精髓:統一
3 . 如何用多態
三 . 封裝
1 . 什么是封裝
? ? ? ? 裝: 往容器 / 名稱空間里存入名字
? ? ? ? 封: 代表存放于名稱空間中的名字給藏起來,這種隱藏對外不對內
2 . 為何要封裝
? ? 2.1 封裝數據屬性:????將數據屬性隱藏起來,類外就無法直接操作屬性,需要類內開辟一個接口來外部的使用可以間接地操作屬性,可以在接口內定義任意的控制邏輯,從而嚴格控制使用對屬性的操作
? ? 2.2 封裝函數屬性:????隔離復雜度
3. 如何封裝
????在類內定義的屬性前加__開頭(沒有__結尾)
????總結:
????????1. __開頭的屬性實現的隱藏僅僅只是一種語法意義上的變形,并不會真的限制類外部的訪問
????????2. 該變形操作只在類定義階段檢測語法時發生一次,類定義階段之后新增的__開頭的屬性并不會變形
? ? ? ? 3. 如果父類不想讓子類覆蓋自己的屬性,可以在屬性前加__開頭