类中的断言和文档,用于派生类中期望的方法

时间:2018-06-21 17:21:56

标签: python inheritance python-3.6 assertions docstring

说我创建一个名为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和文档字符串不符,这违反了规则。但是我只是找不到解决这种情况的“标准”方法。所以我在寻找任何建议。

1 个答案:

答案 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方法并希望它存在的方式。