gpt4 book ai didi

python - 类中派生类中预期方法的断言和文档

转载 作者:行者123 更新时间:2023-12-01 01:48:35 25 4
gpt4 key购买 nike

假设我创建了一个名为 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'."
)

但是,断言表达式仅在创建 Bird 类后才会显示,并不是可以通过 help 访问的“真实”文档字符串。 .

我知道这是一个开放式问题,但是还有其他更好的方法吗?定义 flap_wings 并不违反规则Bird内首先,也许只是 body pass和文档字符串。但我只是找不到处理这种情况的“标准”方法。所以我正在寻找任何建议。

最佳答案

您可以使用 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"""

这建立了某种契约(Contract)。任何未实现 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 方法并期望它存在.

关于python - 类中派生类中预期方法的断言和文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50974304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com