【问题标题】:force implementing specific attributes in subclass python强制在子类 python 中实现特定属性
【发布时间】:2020-04-04 17:55:57
【问题描述】:

我有一个父类,我想“强制”从它继承的每个人都实现一些特定的类属性。

我对方法没有这个问题,因为我创建了一个引发NotImplementedError 的虚拟方法,这很清楚。

至于类属性——我不想在父类中创建它们并将它们设置为 None,因为这不会强制开发人员在子类中实现它们。

演示当前情况的小代码:

class Pet(object):
    name = None

    def make_noise(self):
        raise NotImplementedError("Needs to implement in subclass")

    def print_my_name(self):
        print(self.name)

class Dog(Pet):
    # how to force declairing "name" attribute for subclasses?

    def make_noise(self):
        print("Whof Whof")

在此示例中,开发人员 1 创建了 Pet 类并希望其他开发人员实现具有“名称”属性的子类。 Developer2 实现了一个子类,但不知道他需要实现“name”属性。

是否可以在python中创建这样的限制?

【问题讨论】:

  • 参见 docs.python.org/3/library/abc.html ,向下滚动到文档以了解 abstractmethod。
  • 我觉得 name 应该与 object 相关,如果是这样,你可以这样做 .__init__(name)... 如果你想让一些 doc 将 dog 描述为一种类型,你可以使用 .__doc__/ .__str__/.__repr__ .etc
  • @ShengZhuang,是的,我倾向于同意,我想我没有那样做,因为在我的情况下,叶子类(狗)不是父类(宠物)的直接子类,所以我不想在所有其他父母的 init 中“拖动”那个变量,但实际上为什么不呢?

标签: python inheritance interface


【解决方案1】:

您可以尝试使用ABCMeta 元类或ABC。 之后,您可以使用@abstractmethod@property。 例如:

class Pet(ABC):
    @abstractmethod
    @property
    def name(self)
        pass

    @abstractmethod
    def make_noise(self):
        raise NotImplementedError("Needs to implement in subclass")

    def print_my_name(self):
        print(self.name)

有了这个,你也可以使用@name.setter添加一个setter。

【讨论】:

    【解决方案2】:

    使用可以根据您的要求使用python的Abstract Base Class/ABSMethod Overriding

    【讨论】:

    • 看起来真的很酷!在 ABS 和方法重载中,重点是方法而不是属性。我想如果我会使用其中一种方式,我将不得不实现一个 set 函数
    猜你喜欢
    • 2021-04-02
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 2014-11-23
    • 2017-01-13
    • 1970-01-01
    • 2023-01-27
    相关资源
    最近更新 更多