2011-08-08 7 views
2

__cinit__または__add__に過負荷がかかる可能性はありますか?このような 何か:Cythonのオーバーロード特殊メソッド?

cdef class Vector(Base): 
    cdef double x, y, z 

    def __cinit__(self, double all): 
     self.x = self.y = self.z = all 

    def __cinit__(self, double x, double y, double z): 
     self.x = x 
     self.y = y 
     self.z = z 

    def __str__(self): 
     return "Vector(%s, %s, %s)" % (self.x, self.y, self.z) 

    def __add__(self, Vector other): 
     return Vector(
      self.x + other.x, 
      self.y + other.y, 
      self.z + other.z, 
     ) 

    def __add__(self, object other): 
     other = <double>other 
     return Vector(
      self.x + other.x, 
      self.y + other.y, 
      self.z + other.z, 
     ) 

Vector(0) + Vector(2, 4, 7)呼び出しは、それがオーバーロードされたメソッドとして認識されない__add__(self, Vector other)ように思えるので、フロートは、ここで必要とされていることを私に伝えます。

特別な方法がcdefのように定義すべきではないとだけcdef -fed機能が過負荷にすることができますので、このですか?

答えて

3

特殊関数の演算子のオーバーロードがcythonでサポートされているとは思えません。

あなたの最善の策は、タイプチェックロジックを手動で作成し、それに応じてPythonオブジェクト をキャストすることです。

def __add__(self, other): 
    if type(other) is float: 
     return self.__add__(<double> other) 
    elif isinstance(other,Vector): 
     return self.__add__(<Vector> other) 
    ... 
関連する問題