2017-05-29 10 views
0

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のような)現在

答えて

1

https://github.com/numba/numba/issues/1606#issuecomment-284552746

私は、正確な内部を知りませんが、それはそう単純に廃棄されている方法です。 jitclassでインスタンス化すると、Pythonクラスを直接インスタンス化するのではなく、低レベルのnumba型をラップしていることに注意してください。

v = xy(1, 2) 

v 
Out[8]: <numba.jitclass.boxing.xy at 0x2e700274950> 

v._numba_type_ 
Out[9]: instance.jitclass.xy#2e77d394438<x:float64,y:float64> 
+0

Aww、あまりにも悪いです。少なくとも私は更新する必要はありません:) – kazemakase

関連する問題