2016-12-02 42 views
1

考慮我的課mint當類實例在右邊時,如何讓我的類控制添加操作?

class mint(object): 
    def __init__(self, i): 
     self.i = i 

    def __add__(self, other): 
     o = other.i if isinstance(other, mint) else other 
     return mint(1 + self.i + o) 

    def __repr__(self): 
     return str(self.i) 

它的設計做了另一種添加。

a = mint(1) 

a + 1 + 2 

6 

但是,添加雖然我的對象是在右側不起作用。

1 + a 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-519-8da568c0620a> in <module>() 
----> 1 1 + a 
TypeError: unsupported operand type(s) for +: 'int' and 'mint' 

問:如何修改我的課,使得1 + a是否行得通呢?

+1

http://stackoverflow.com/a/5082229/6394138 – Leon

+1

除了如以下所示,也考慮執行['.__ iadd__']實施'.__ radd__'( https://docs.python.org/3.5/reference/datamodel.html#object.__iadd__)。 –

+0

冒險在'熊貓'之外,我明白了。 –

回答

1

您可以使用__radd__

class mint(object): 
    def __init__(self, i): 
     self.i = i 

    def __add__(self, other): 
     o = other.i if isinstance(other, mint) else other 
     return mint(1 + self.i + o) 

    def __repr__(self): 
     return str(self.i) 

    def __radd__(self, other): 
     return self + other 

a = mint(1) 
print(1 + a) 

輸出:

3 

下面是從Python文檔的解釋:

這些方法稱爲執行二進制算術運算( +, - ,*,@,/,//,%,divmod(),pow(),**,< <,>>,&,^,|)與反映(交換)的操作數。這些函數僅在左操作數不支持相應操作且操作數具有不同類型時纔會調用。 [2]例如,要評估表達式x-y,其中y是具有rsub()方法的類的實例。 rsub(x)如果x被調用。 sub(y)返回NotImplemented。

1

實施__radd__

In [1]: class mint(object): 
    ...:  def __init__(self, i): 
    ...:   self.i = i 
    ...: 
    ...:  def __add__(self, other): 
    ...:   o = other.i if isinstance(other, mint) else other 
    ...:   return mint(1 + self.i + o) 
    ...: 
    ...:  def __repr__(self): 
    ...:   return str(self.i) 
    ...:   
    ...:  def __radd__(self, other): 
    ...:   return self.__add__(other) 
    ...:  

In [2]: a = mint(1) 

In [3]: 1 + a 
Out[3]: 3 
相關問題