【发布时间】:2020-04-14 23:53:08
【问题描述】:
我正在尝试使用未实现的方法编写一个抽象类,这将强制继承的子级在重写方法(在装饰器中定义)时返回特定类型的值。
当我使用下面显示的代码时,子方法不会调用装饰器。我认为这是因为该方法被覆盖,这很有意义。我的问题基本上是这样的: 有没有办法通过方法覆盖使装饰器持久化?
我不反对使用装饰器以外的其他东西,但这是一个很快就浮现在脑海中的解决方案,我很想知道是否有任何方法可以让它发挥作用。
如果使用装饰器是正确且可能的选择,它将如下所示:
def decorator(returntype):
def real_decorator(function):
def wrapper(*args, **kwargs):
result = function(*args, **kwargs)
if not type(result) == returntype:
raise TypeError("Method must return {0}".format(returntype))
else:
return result
return wrapper
return real_decorator
我需要我的父类看起来与这个相似:
class Parent(ABC):
@decorator(int)
@abstractmethod
def aye(self, a):
raise NotImplementedError
子类会做这样的事情:
class Child(Parent):
def aye(self, a):
return a
如果需要,我非常乐意更好地澄清我的问题,并感谢所有花时间提前阅读此问题的人!
【问题讨论】:
-
如果你真的有很好的用例,你也应该metathink。
-
您还要求做两件不同的事情。正如@mgc 提到的那样,静态类型检查可能就足够了。强制签名对我来说似乎总是反python,但在某些情况下可能需要/有用。没有质疑。
-
如果返回类型强制是你唯一的目标,你能不使用更简单的东西吗?说
def aye(self, a): res = self._aye(a) assert isinstance(res, int) return res,其中_aye是子类的实际方法,aye是它的公共类型检查调用器? -
感谢您关注我的问题@progmatico!由于此类消费者的某些限制,我必须确保这些方法以错误的返回类型失败。 @mgc 的解决方案可以工作,因为如果 mypy 没有通过,我可能会使 CI/CD 进程失败,但我绝对必须强制执行返回类型:)
标签: python python-3.x python-decorators