【问题标题】:Python OOP - How do I break out of an inherited (super) method based on the parent method?Python OOP - 如何摆脱基于父方法的继承(超级)方法?
【发布时间】:2020-11-21 23:20:13
【问题描述】:

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

例如,在这个人为的示例中,如果未提供some_thing,则在__init__() 中将其设置为None。因为它的值为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

【问题讨论】:

    标签: python class oop object inheritance


    【解决方案1】:

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

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

    add_some_thing() 的唯一实现是在基类中。它会或不会调用_add_some_thing(),具体取决于它想要的任何标准。类实现和覆盖_add_some_thing()

    【讨论】:

    • 谢谢,@frank-yellin。这对我理解如何解决这些问题有很大帮助。我想我已经差不多了。现在唯一的问题是我必须使用两组括号来获取返回值t.add_some_thing()()。关于我要去哪里错的任何建议?更新了问题的底部以显示我做了什么以及我现在得到了什么。
    • 没关系。弄清楚了。我返回self._add_some_thing 而不是self._add_some_thing()。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多