私は、__mul__
や__add__
のような特別なメソッドを実装し、多重継承を使用する代数オブジェクトのクラスの階層を持っています。私は何とかPython(> = 3.5)が、NotImplemented
を返さない最初のメソッドを見つけるためにメソッド解決命令(mro)を歩くと仮定していました。悲しいかな、これはそうではないようです。以下の最小限の例を考えてみます。このコードでNotImplementedを返すPython特別メソッドのウォークMRO
class A():
def __mul__(self, other):
return "A * %s" % other
class B():
def __mul__(self, other):
if isinstance(other, int):
return "B * %s" % other
else:
return NotImplemented
class C(B, A):
pass
class D(B, A):
def __mul__(self, other):
res = B.__mul__(self, other)
if res is NotImplemented:
res = A.__mul__(self, other)
return res
を、私は希望の動作とD
を実装している:
>>> d = D()
>>> d * 1
'B * 1'
>>> d * "x"
'A * x'
をしかし、私は実際にD
と同じように動作するC
を期待しているだろう、それdoes not:
>>> c = C()
>>> c * 1
'B * 1'
>>> c * "x"
Traceback (most recent call last):
File "<ipython-input-23-549ffa5b5ffb>", line 1, in <module>
c * "x"
TypeError: can't multiply sequence by non-int of type 'C'
私は何が起こっているのか理解しています:私はちょうどfiの結果を返しています(私はちょうどNotImplemented
が特別な値として扱われることを望んでいた)
D.__mul__
のような定型文を書く方法があれば私の質問です。すべてのクラスのためのすべての数値的特殊メソッド)。私はこれらのメソッドを自動的に生成するためにクラスデコレータやメタクラスを書くことができると思いますが、もっと簡単な(標準ライブラリ)方法があるとか、誰かがすでにこのようなことをしていることを望んでいました。
うん、それだよ!あなたが一度それを見たら完全に意味をなさない! –