Скажем, я создаю класс с именем Bird, который я хочу использовать только как родительский класс, а производные классы должны иметь метод flap_wings
:
class Bird:
def fly(self):
self.flap_wings()
Ожидаемый производный класс может выглядеть так:
class Eagle(Bird):
def flap_wings(self):
print('flapping wings')
Каков хороший и понятный способ для Bird
одновременно утверждать, что его производные классы имеют метод flap_wings
, а также включать документацию о том, что ожидается от flap_wings
?
Прямо сейчас я использую __init_subclass__
:
class Bird:
def fly(self):
self.flap_wings()
def __init_subclass__(cls, **kwargs):
assert hasattr(cls, 'flap_wings'), (
"Derived classes have to have a flap_wings method which should "
"print 'flapping wings'."
)
Но выражение assert появляется только после создания класса Bird и не является «настоящей» строкой документации, к которой можно получить доступ через help
.
Я знаю, что это открытый вопрос, но каковы другие лучшие способы? Это не противоречит правилам сначала определить flap_wings
внутри Bird
, возможно, только с телом pass
и строкой документации. Но я просто не мог найти «стандартных» способов справиться с этой ситуацией. Поэтому я ищу любые предложения.
__init_subclass__
с впечатлением, что это более простой способ сделать то, что здесь делают метаклассы, но я думаю, что__init_subclass__
просто не предлагает достаточно, чтобы делать то, что я хочу. - person Jay Calamari   schedule 21.06.2018