<p>我不确定您是否可以按照您想要的方式持久化decorator的效果,但是您仍然可以在<code>Parent</code>类中装饰一个包装函数,它将不是<code>abstractmethod</code>并让子类实现这样的包装函数:</p>
<pre><code>from abc import ABC, abstractmethod
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)
def aye(self, a):
return self.impl_aye(a)
@abstractmethod
def impl_aye(self, a):
raise NotImplementedError
class Child(Parent):
def impl_aye(self, a):
return a
</code></pre>
<p>还有一些解决方案可以保护<code>aye</code>方法,使其不受要重写的<code>Parent</code>类的影响。例如,请参见<a href="https://stackoverflow.com/a/28803868/5050917">this answer</a>。在</p>
<p>否则,如果您想使用<a href="https://www.python.org/dev/peps/pep-0484/" rel="noreferrer">type hints</a>并使用<a href="http://mypy-lang.org/" rel="noreferrer">mypy</a>(<em>Python的可选静态类型检查器)检查代码,如果您试图实现返回类型与其父类不兼容的子类,则可能会收到错误消息:</p>
^{pr2}$
<p><code>mypy</code>的输出:</p>
<pre><code>a.py:9: error: Return type "str" of "aye" incompatible with return type "int" in supertype "Parent"
Found 1 error in 1 file (checked 1 source file)
</code></pre>