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__()
Какой лучший дизайн?