標籤:false 學習 meta imp 基礎 讀寫 instance import hook
http://yansu.org/2013/06/09/learn-Python-abc-module.html
1.abc模組作用
Python本身不提供抽象類別和介面機制,要想實現抽象類別,可以藉助abc模組。ABC是Abstract Base Class的縮寫。
2.模組中的類和函數abc.ABCMeta
這是用來產生抽象基礎類的元類。由它產生的類可以被直接繼承。
from abc import ABCMetaclass MyABC: __metaclass__ = ABCMetaMyABC.register(tuple)assert issubclass(tuple, MyABC)assert isinstance((), MyABC)
上面這個例子中,首先產生了一個MyABC的抽象基礎類,然後再將tuple變成它的虛擬子類。然後通過issubclass或者isinstance都可以判斷出tuple是不是出於MyABC類。
另外,也可以通過複寫__subclasshook__(subclass)
來實現相同功能,它必須是classmethod
class Foo(object): def __getitem__(self, index): ... def __len__(self): ... def get_iterator(self): return iter(self)class MyIterable: __metaclass__ = ABCMeta @abstractmethod def __iter__(self): while False: yield None def get_iterator(self): return self.__iter__() @classmethod def __subclasshook__(cls, C): if cls is MyIterable: if any("__iter__" in B.__dict__ for B in C.__mro__): return True return NotImplementedMyIterable.register(Foo)
abc.abstractmethod(function)
表明抽象方法的產生器
class C: __metaclass__ = ABCMeta @abstractmethod def my_abstract_method(self, ...): ...
abc.abstractproperty([fget[,fset[,fdel[,doc]]]])
表明一個抽象屬性
class C: __metaclass__ = ABCMeta @abstractproperty def my_abstract_property(self): ...
上例只是唯讀屬性,如果是讀寫屬性,可以如下:
class C: __metaclass__ = ABCMeta def getx(self): ... def setx(self, value): ... x = abstractproperty(getx, setx)
學習Python的ABC模組(轉)