これらは、抽象基本クラスを作成し、具象クラスに登録するためのさまざまな方法です。
輸入品:
from abc import ABCMeta
from abc import ABC
from abc import abstractmethod
方法 1:
>>> class A(metaclass=ABCMeta):
... @abstractmethod
... def hello(self):
... return
...
>>> class B(A):
... def hello(self):
... print("Hello World!")
...
>>> b = B()
>>> b.hello()
Hello World!
>>>
>>> print(B.__mro__)
(<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
方法 2:
>>> class A(object):
... __metaclass__ = ABCMeta
...
... @abstractmethod
... def hello(self):
... return
...
>>> class B(A):
... def hello(self):
... print("Hello World!")
...
>>> b = B()
>>> b.hello()
Hello World!
>>>
>>> print(B.__mro__)
(<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
方法 3:
>>> class A(ABC):
... @abstractmethod
... def hello(self):
... return
...
>>> class B(A):
... def hello(self):
... print("Hello World!")
...
>>> b = B()
>>> b.hello()
Hello World!
>>>
>>> print(B.__mro__)
(<class '__main__.B'>, <class '__main__.A'>, <class 'abc.ABC'>, <class 'object'>)
方法 4:
>>> class A(metaclass=ABCMeta):
... @abstractmethod
... def hello(self):
... return
...
>>> class B(object):
... def hello(self):
... print("Hello World!")
...
>>> A.register(B)
<class '__main__.B'>
>>>
>>> b = B()
>>> b.hello()
Hello World!
>>>
>>> print(B.__mro__)
(<class '__main__.B'>, <class 'object'>)
方法 5:
>>> class A(ABC):
... @abstractmethod
... def hello(self):
... return
...
>>> class B(object):
... def hello(self):
... print("Hello World!")
...
>>> A.register(B)
<class '__main__.B'>
>>>
>>> b = B()
>>> b.hello()
Hello World!
>>>
>>> print(B.__mro__)
(<class '__main__.B'>, <class 'object'>)
質問:
- MRO とは別に、それらの違いは何ですか?
- 使用例は異なりますか?
- それらの間でそれを行うための好ましい方法またはよりpythonicな方法はありますか?
PS: #2 のみが Python 2 でも機能することに注意してください