Я пытаюсь понять метакласс черной магии в Python. AFAIK, метаклассы могут использоваться, например, чтобы гарантировать, что какой-то метод реализован в производном классе, но у меня есть проблема внучат . Кажется, мне нужно явно реализовать все требуемые производные методы, даже если для этого нет причины (?).
Посмотрите на это:
~ $ ipython
Python 3.6.5 (default, Apr 14 2018, 13:17:30)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.3.1 -- An enhanced Interactive Python. Type '?' for help.
In [1]: class Meta(type):
...: def __new__(cls, name, bases, body):
...: if 'some_method' not in body:
...: raise AttributeError('some_method should be implemented')
...: return super().__new__(cls, name, bases, body)
...:
...: class Base(metaclass=Meta):
...: def some_method(self):
...: print('Yay')
...:
...: class Derived(Base):
...: pass
...:
...:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-1-51c072cc7909> in <module>()
9 print('Yay')
10
---> 11 class Derived(Base):
12 pass
<ipython-input-1-51c072cc7909> in __new__(cls, name, bases, body)
2 def __new__(cls, name, bases, body):
3 if 'some_method' not in body:
----> 4 raise AttributeError('some_method should be implemented')
5 return super().__new__(cls, name, bases, body)
6
AttributeError: some_method should be implemented
Насколько я понимаю, этого не должно происходить, потому что some_method
должен быть получен из Base
класса, как здесь:
In [3]: class Base:
...: def some_method(self):
...: print('Yay')
...:
...: class Derived(Base):
...: pass
...:
...:
In [4]: Derived().some_method()
Yay
Это ожидается? Если да, не могли бы вы дать мне подсказку, как исправить такое поведение, чтобы мне не нужно было переопределять методы?