Python 面向對象--繼承,實現,依賴,關聯,聚合,組合
一. 繼承
繼承指的是子類繼承父類除私有內容以外的其他所有內容, 並且子類具有增加自己新內容的能力.
舉例說明:
class Animal: print("吃是動物的本能") class Cat(Animal): def cat_eat(self): print("貓兒優雅地吃東西") c = Cat() c.cat_eat() # 以上代碼執行結果: # 吃是動物的本能 # 貓兒優雅地吃東西
二. 接口實現(約束,重寫)
1. 用普通類定義接口(推薦使用)
舉例說明:
class Animal: # 父類Animal具有約束作用, 子類必須對父類的方法進行重寫 defeat(self): pass def sleep(self): pass class Dog(Animal): def eat(self): print("狗吃狗糧") def sleep(self): print("狗趴著睡") class Cat: def eat(self): print("貓吃貓糧") def sleep(self): print("貓躺著睡") dog = Dog() dog.eat() cat = Cat() cat.sleep()
2. 用抽象類和抽象函數實現方法(不推薦,了解即可)
舉例說明:
from abc import ABCMeta, abstractmethod class Animal(metaclass=ABCMeta): # 表示抽象類 @abstractmethod # 加裝飾器 def eat(self): pass class Dog(Animal): def eat(self): print("狗吃狗糧") class Cat: def eat(self): print("貓吃貓糧") dog = Dog() dog.eat() cat = Cat() cat.eat()
三. 依賴
可以簡單的理解, 就是一個類 A 使用到了另一個類 B, 而這種使用關系是具有偶然性的,臨時性的 非常弱的, 但是 B 類的變化會影響到 A. 比如某人要過河,需要借用一條船,此時人與船之間的關系就是依賴. 表現在代碼層面為: 類 B 作為參數被類 A 在某個method 方法中使用.
舉例說明:
class Person: def __init__(self, name): self.name = name def call_up(self, cellphone): print("%s正在使用%s打電話" % (self.name, cellphone.name)) cellphone.call() class Cellphone: def __init__(self, name): self.name = name def call(self): print("%s正在為您呼叫" % self.name) person = Person("王乃卉") cellphone = Cellphone("iPhoneX") person.call_up(cellphone) # 以上代碼執行結果是: # 王乃卉正在使用iPhoneX打電話 # iPhoneX正在為您呼叫
四. 關聯
關聯體現的是兩個類, 或者類與接口之間語義級別的一種強依賴關系.
比如我和我的朋友, 這種關系比依賴更強, 不存在依賴關系的偶然性, 關系也不是臨時性的, 一般是長期性的, 而且雙方的關系一般是平等的, 關聯可以是單向,雙向的.
表現在代碼層面為: 被關聯類 B 以類屬性的形式出現在關聯類 A 中, 也可能是關聯類 A 引用了一個類型為被關聯類 B 的全局變量.
1. 聚合
聚合是關聯關系的一種特例, 它體現的是整體與部分,擁有的關系, 即 has-a 的關系. 此時整體與部分之間是可分離的, 他們可以具有各自的生命周期, 部分可以屬於多個整體對象, 也可以為多個整體對象享. 比如計算機與 CPU, 公司與員工的關系等.
表現在代碼層面, 和關聯關系是一致的,只能從語義級別來區分.
2. 組合
組合也是關聯關系的一種特例, 它體現的是一種 contains-a 的關系, 這種關系比聚合更強, 也稱為強聚合. 它同樣體現整體與部分間的關系, 但此時整體與部分是不可分的, 整體的生命周期結束也就意味著部分的生命周期結束. 比如你和你的大腦. 表現在代碼層面, 和關聯關系是一致的,只能從語義級別來區分.
輔助理解:
大雁喜歡熱鬧害怕孤獨, 所以它們一直過著群居的生活, 這樣就有了雁群. 每一只大雁都有自己的雁群, 每個雁群都有很多大雁, 大雁與雁群的這種關系就可以稱之為聚合. 另外, 每只大雁都有兩只翅膀, 大雁與雁
翅的關系就叫做組合. 由此可見, 聚合的關系明顯沒有組合緊密, 大雁不會因為它們的首領將雁群解散而無法生存, 而雁翅就無法脫離大雁而單獨生存.
所以說, 聚合關系的類具有不同的生命周期, 而組合關系的類具有相同的生命周期.
----------------------------------------------------------------
參考資料:
1. python的幾種實現方式
2. python中的接口
3. 面向對象中的聚合與耦合
----------------------------------------------------------------
Python 面向對象--繼承,實現,依賴,關聯,聚合,組合