1.抽象類別概念
抽象類別是一個特殊的類,只能被繼承,不能執行個體化
2.為什麼要有抽象類別
其實在未接觸抽象類別概念時,我們可以構造香蕉、蘋果、梨之類的類,然後讓它們繼承水果這個的基類,水果的基類包含一個eat函數。
但是你有沒有想過,我們可以將香蕉、蘋果、梨執行個體化,去吃香蕉、蘋果、梨。但是我們卻不能將水果執行個體化,因為我們無法吃到叫水果的這個東西。
所以抽象類別中只能有抽象方法(沒有實現功能),該類不能被執行個體化,只能被繼承,且子類必須實現抽象方法。
3.抽象類別的作用
在不同的模組中通過抽象基類來調用,可以用最精簡的方式展示出代碼之間的邏輯關係,讓模組之間的依賴清晰簡單。
抽象類別的編程,讓每個人可以關注當前抽象類別的方法和描述,而不需要考慮過多的實現細節,這對協同開發有很大意義,也讓代碼可讀性更高。
4.抽象類別的使用
import abc # 利用abc模組實現抽象類別class File(metaclass=abc.ABCMeta): # abc.ABCMeta是實現抽象類別的一個基礎類 @abc.abstractmethod # 定義抽象方法,無需實現功能 def read(self): passclass Txt(File): # 子類繼承抽象類別,但是必須定義read方法將抽象類別中的read方法覆蓋 def read(self): print('文本資料的讀取方法')txt1 = Txt()txt1.read() txt2 = File()txt2.read()
運行結果如下
文本資料的讀取方法Traceback (most recent call last): File "E:/python/ftp_work/test.py", line 20, in <module> txt2 = File()TypeError: Can't instantiate abstract class File with abstract methods read
顯然將抽象類別執行個體化報錯了,得到了我們想要的結果
5.abc模組在Python2&3的相容問題
為解決相容性問題,我們需要引入six模組
通用做法。@six.add_metaclass(MetaClass) 的作用是在不同版本的Python之間提供一個優雅的聲明類的metaclass的手段,事實上不用它也可以,只是使用了它代碼更為整潔明了。 |
import six @six.add_metaclass(Meta)class MyClass(object): pass |
在Python 3 等價於 |
import six class MyClass(object, metaclass = Meta): pass |
在Python 2.x (x >= 6)中等價於 |
import six class MyClass(object): __metaclass__ = Meta pass |
或者直接調用裝飾器,這裡也能看出來裝飾器就是個方法封裝而已。 |
import six class MyClass(object): passMyClass = six.add_metaclass(Meta)(MyClass) |