TL; DR:でクラスをデコレートするときは、__add__
などの特殊メソッドはクラスのインスタンスには表示されず、他のメソッドは正常に動作します。なぜこれが起こるのですか?クラスは完全に正常に動作しないとデコレータ`@numba.jitclass`の特別なメソッドはどこに行きますか?
import numba as nb
dual_spec = [('x', nb.float64), ('y', nb.float64)]
@nb.jitclass(dual_spec)
class xy:
def __init__(self, x, y):
self.x = x
self.y = y
def addition(self, other):
return xy(self.x + other.x, self.y + other.y)
def __add__(self, other):
return xy(self.x + other.x, self.y + other.y)
:
は、次のクラス宣言を考えてみましょう。 __add__
メソッドのためにxy(1, 2) + xy(3, 4)
のような式が可能であり、期待される結果を返します。しかし、デコレータと私は、次のエラーメッセージが表示されます。
>>> xy(1, 2) + xy(3, 4) # TypeError: unsupported operand type(s) for +: 'xy' and 'xy'
>>> xy(1, 2).addition(xy(3, 4)) # But this works nicely
__add__
方法はxy
オブジェクトに存在していないように見えます:
>>> xy(1, 2).__add__ # AttributeError: 'xy' object has no attribute '__add__'
しかし、メソッドがクラスに存在している:
>>> xy.__add__ # <function __main__.xy.__add__>
インスタンス化中に__add__
メソッドに対してnumbaは何をしていますか? xy(1, 2) + xy(3, 4)
を書くことができるように、jittedクラスの演算子を有効にする別の方法はありますか? jitclassesに演算子オーバーロードはここで、未解決の問題がサポートされていません(numbaバージョン0.33
のような)現在
Aww、あまりにも悪いです。少なくとも私は更新する必要はありません:) – kazemakase