说我创建一个名为Bird的类,我只想用作父类,而派生类应具有方法System:
Arch-Linux 4.17.2-1-Arch
JDK: aur-package called: JDK
Eclipse-Version: the latest from the repositories (eclipse-java version: 4.7.3.a-1)
:
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__
但是,断言表达式仅在创建Bird类之后才会显示,并且不是可以通过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'."
)
访问的“真实”文档字符串。
我知道这是一个开放式问题,但是还有其他更好的方法吗?首先在help
中定义flap_wings
可能与主体Bird
和文档字符串不符,这违反了规则。但是我只是找不到解决这种情况的“标准”方法。所以我在寻找任何建议。
答案 0 :(得分:2)
您可以将abc
库用于抽象方法:
from abc import ABCMeta, abstractmethod
import six
class Bird(six.with_metaclass(ABCMeta)):
def fly(self):
"""Take flight.
Notes
-----
This depends on the abstract method `flap_wings`. If you've
not implemented this at the subclass level, your subclass
cannot be properly instantiated.
"""
self.flap_wings()
@abstractmethod
def flap_wings(self):
"""Subclasses must implement this"""
这会建立各种合同。任何未实现flap_wings
方法的子类都会在实例化时引发错误:
class Flamingo(Bird):
pass
>>> Flamingo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Flamingo with abstract methods flap_wings
实现抽象方法的子类可以正常工作:
class BlueJay(Bird):
def flap_wings(self):
print("Flappity flap")
>>> BlueJay().fly()
Flappity flap
就记录子类而言,由于所有子类都继承了fly
方法,因此您可以在其文档字符串中包含调用flap_wings
方法并希望它存在的方式。