__add __(およびその他の魔法のメソッド)を動的に定義する[複製]
Nov 24 2020
にa + b
拡大すると聞きましたa.__add__(b)
。ただし、私のコードではそのようには機能しません。このコードを取る:
class TestAdd:
def __init__(self, a):
self.a = a
def __getattr__(self, name):
if name == '__add__':
return (lambda y: self.a + y)
試してみるとTestAdd(5).__add__(1)
、6が正しく返されます。試してみるとTestAdd(5) + 1
、次のエラーが発生します。
TypeError Traceback (most recent call last)
<ipython-input-3-1c04c7082b89> in <module>
----> 1 TestAdd(5) + 1
TypeError: unsupported operand type(s) for +: 'TestAdd' and 'int'
どうしてこれなの?私は何かが足りないのですか?
回答
chepner Nov 24 2020 at 03:11
マジックメソッドはインスタンスではなくクラスで検索されます。TestAdd(5) + 1
より正確にはtmp = TestAdd(5); TestAdd.__add__(tmp, 1)
、と同等であり、を定義していませんTestAdd.__add__
。
AKX Nov 24 2020 at 03:10
__getattr__
マジックメソッドを動的に返すために使用することはできません。これは、マニュアルの3.3.10特別なメソッドルックアップに詳細に記載されています。