我想用functools.singledispatchmethod
来重载一个名为Polynomial
的类的二进制算术运算符方法.我的问题是,我找不到一种方法来注册other
是Polynomial
的方法调用.
或许用一个简单的例子来解释会更好:
from __future__ import annotations
from functools import singledispatchmethod
class Polynomial:
@singledispatchmethod
def __add__(self, other):
return NotImplemented
@__add__.register
def _(self, other: Polynomial):
return NotImplemented
上面的代码引发NameError:
NameError: name 'Polynomial' is not defined
这个NameError
不是由注释引起的,而是在functools
内部引发的.此外,使用字符串'Polynomial'
而不需要__future__.annotations
的注释也不起作用.这一行为在the documentation for functools.singledispatchmethod中没有记录.
我可以使Polynomial
继承自另一个类,然后在类型批注中使用该类,从而使其正常工作:
from functools import singledispatchmethod
class _Polynomial:
pass
class Polynomial(_Polynomial):
@singledispatchmethod
def __add__(self, other):
return NotImplemented
@__add__.register
def _(self, other: _Polynomial):
return NotImplemented
..但我并不是太喜欢这个解决方案.
我如何才能在不需要无用的中间类的情况下工作呢?