class ABC
「抽象基本クラス」です。class X
そのサブクラスです。
のサブクラスで実行する必要のある作業がいくつかありますがABC
、これは忘れたり、間違って実行したりするのが簡単です。私は次のABC.__init__()
いずれかでそのような間違いを見つけるのを手伝いたいと思います:
(1)その作業を開始する、または(2)それを検証する
super().__init__()
これは、が最初に呼び出されるか、最後に呼び出されるかに影響しX.__init__()
ます。
説明のための簡単な例を次に示します。
のすべてのサブクラスにABC
属性が必要registry
であり、それがリストである必要があるとします。ABC.__init__()
(1)初期化するregistry
か、(2)正しく作成されたことを確認することができます。以下は、各アプローチのサンプルコードです。
アプローチ1:ABCで初期化
class ABC:
def __init__(self):
self.registry = []
class X:
def __init__(self):
super().__init__()
# populate self.registry here
...
アプローチ2:ABCで検証する
class ABC:
class InitializationFailure(Exception):
pass
def __init__(self):
try:
if not isinstance(self.registry, list):
raise ABC.InitializationError()
except AttributeError:
raise ABC.InitializationError()
class X:
def __init__(self):
self.registry = []
# populate self.registry here
...
super().__init__()
どちらがより良いデザインですか?