首页 > 解决方案 > Python OOP - 如何摆脱基于父方法的继承(超级)方法?

问题描述

在基类中,我想测试一些东西,如果不是 True,我想避免在子类的方法中发生任何处理。

例如,在这个人为的示例中,如果some_thing未提供,则将其设置为Nonein __init__()。因为它的值为None,所以在基类add_some_thing()方法中,我想返回字符串“Nothing”。但这并不妨碍子类的add_some_thing()方法继续进行。我怎样才能做到这一点?

我将有多个继承自 的类BaseQuery,或者我只是将if not self.some_thing...功能移至子类。我试图不重复代码十几次。

from abc import ABC, abstractmethod


class BaseQuery(ABC):

    def __init__(
        self,
        some_thing=None,
    ):
        self.some_thing = some_thing
        super().__init__()

    @abstractmethod
    def add_some_thing(self):
        if not self.some_thing:
            return "Nothing"


class SpecificQuery(BaseQuery):

    def add_some_thing(self):
        super().add_some_thing()

        return self.some_thing

我得到了什么:

>>> t = SpecificQuery()
>>> print(t.add_some_thing())
None

>>> t = SpecificQuery(some_thing="Whatever")
>>> print(t.add_some_thing())
Whatever

我想要的是:

>>> t = SpecificQuery()
>>> print(t.add_some_thing())
Nothing

>>> t = SpecificQuery(some_thing="Whatever")
>>> print(t.add_some_thing())
Whatever

我想真正的问题是:如果提供了返回值,我如何让子类中的方法尊重父类的返回值?


编辑:根据弗兰克的回答,设法让它工作。这是最终产品,以防其他人正在寻找类似信息:

from abc import ABC, abstractmethod


class BaseQuery(ABC):

    def __init__(
        self,
        some_thing=None,
    ):
        self.some_thing = some_thing
        super().__init__()

    def add_some_thing(self):
        if not self.some_thing:
            return "Nothing"
        else:
            return self._add_some_thing()

    @abstractmethod
    def _add_some_thing(self):
        return


class SpecificQuery(BaseQuery):

    def _add_some_thing(self):
        super()._add_some_thing()

        return self.some_thing

我现在得到的:

>>> t = SpecificQuery()
>>> print(t.add_some_thing())
Nothing

>>> t = SpecificQuery(some_thing="Whatever")
>>> print(t.add_some_thing())
Whatever

标签: pythonclassoopobjectinheritance

解决方案


子类覆盖基类,而不是相反。

不过有一个解决办法。通常,这是通过一个辅助方法来实现的_add_some_thing。辅助方法名称中的下划线暗示这是一个受保护的方法,只能由子类使用。

的唯一实现add_some_thing()是在基类中。_add_some_thing()它根据它想要的任何标准调用或不调用。类实现和覆盖_add_some_thing()


推荐阅读