【发布时间】: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