python - Python OOP - 如何摆脱基于父方法的继承(超级)方法?
问题描述
在基类中,我想测试一些东西,如果不是 True,我想避免在子类的方法中发生任何处理。
例如,在这个人为的示例中,如果some_thing
未提供,则将其设置为None
in __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
解决方案
子类覆盖基类,而不是相反。
不过有一个解决办法。通常,这是通过一个辅助方法来实现的_add_some_thing
。辅助方法名称中的下划线暗示这是一个受保护的方法,只能由子类使用。
的唯一实现add_some_thing()
是在基类中。_add_some_thing()
它根据它想要的任何标准调用或不调用。类实现和覆盖_add_some_thing()
。
推荐阅读
- c# - 我可以使用 python 运行 C# 脚本文件(.cs)吗?
- javascript - 使用 AJAX 从文本文件中读取数据无法按预期工作
- c++ - 将句柄对象传递给 C++ 会导致引用泄漏?
- symfony - Symfony 4.2 事件 POST_SUBMIT 返回 null
- meteor - Meteor 服务器方法上引发的错误不记录原始堆栈跟踪
- android - 为什么在场景转换期间视图会被剪裁?
- javascript - 我如何从 React 中嵌套的子组件获取父组件中的数据?
- c# - 如何在 Xamarin Forms 应用程序中实现服务?
- amazon-web-services - 如何确定 AWS 用户/arn 是否没有控制台/管理员权限
- kivy - 如何为 Kivy 标签中的变量编码?