1

これらは、抽象基本クラスを作成し、具象クラスに登録するためのさまざまな方法です。

輸入品:

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'>)

質問:

  1. MRO とは別に、それらの違いは何ですか?
  2. 使用例は異なりますか?
  3. それらの間でそれを行うための好ましい方法またはよりpythonicな方法はありますか?

PS: #2 のみが Python 2 でも機能することに注意してください

4

0 に答える 0