2017-09-25 8 views
3

私はチュートリアルを検索してPython 2を学んできました。私はクラスのことを発見しています。私は__add__ダンメーの方法でいくつかの問題があります。私はどのようにを追加するクラスの2つのオブジェクトを追加します。__add__ 2つのクラスオブジェクト

鮮明にするには、次の

class Add_obj: 
    def __init__(self, *num): 
     self.num = num 

    def __repr__(self): 
     return 'Add_obj{}'.format(self.num) 

    def __add__(self, other): 
     for i in zip(*(self.num + other.num)): 
      # and then some codes over here 

#when: 
obj1 = Add_obj(2, 5) 
obj2 = Add_obj(4, 7) 
# it should return Add_obj(6, 12) 

私はそれが2つのオブジェクトを追加するための最良の方法ではありません知っていますか?

+3

あなたはまだ学んでいる間、あなたは、Python 3.6に切り替える必要があります - それはバージョン2.xに改良したものである - https://pythonclock.org/ – wwii

+0

'self.num'は何ですか?シーケンスまたは単一の数字?たぶんdocstringを '__init__'やクラス自体に追加することができます。まず、forループに 'i'を表示して、あなたが何を持っているかを見てから、何をするのかを考えてみてください。 – wwii

+1

あなたの試行と両方の答えに注意するべきことがあります。二つのオブジェクトの長さが 'num'の長さが異なる場合、' zip'を使うとより長い 'num'が切り捨てられます。したがって、異なるサイズのオブジェクトを追加することはできますが、これは意図された動作であるとは考えにくいです。 2つのオブジェクトが同じ長さであることを明示的にサニティチェックしたり、必要に応じて短いオブジェクトに0を埋め込むソリューションを使用したりすることもできます。 –

答えて

3

operator.addとを使用し、__add__に反復可能なアンパック(*を使用)を使用できます。たとえば、次のように

import operator 

class Add_obj: 
    def __init__(self, *num): 
     self.num = num 

    def __repr__(self): 
     return 'Add_obj{}'.format(self.num) 

    def __add__(self, other): 
     return self.__class__(*map(operator.add, self.num, other.num)) 

そして、それは確かに「期待されるオブジェクト」を返します。しかしmapは本当にそれだけでこれを実現するために非常にパフォーマンスと短い方法です必要とされていない

>>> obj1 = Add_obj(2, 5) 
>>> obj2 = Add_obj(4, 7) 
>>> obj1 + obj2 
Add_obj(6, 12) 

を。また、代わりに、理解とzipを使用することができます。

def __add__(self, other): 
    return self.__class__(*[num1+num2 for num1, num2 in zip(self.num, other.num)]) 

としては、これも動作しますが、おそらく予期しない(あるいは間違った)与えるコメントで指摘2 Add_obj長さが異なる場合に生じます。例えば

def __add__(self, other): 
    if len(self.num) != len(other.num): 
     raise ValueError('cannot two Add_obj with different lengths') 
    ... # use one of the both approaches from above 

:あなたは二つの異なるサイズのオブジェクトを追加することを禁止したい場合は、代わりに例外を発生させる可能性が

>>> obj1 = Add_obj(2, 5) 
>>> obj2 = Add_obj(4, 7, 2) 
>>> obj1 + obj2 
ValueError: cannot two Add_obj with different lengths 

それとも、ゼロパッドでした短い1:

from itertools import izip_longest as zip_longest # only zip_longest on Python 3 

class Add_obj: 

    ... 

    def __add__(self, other): 
     return self.__class__(*[num1+num2 for num1, num2 in zip_longest(self.num, other.num, fillvalue=0)]) 

例:

>>> obj1 = Add_obj(2, 5) 
>>> obj2 = Add_obj(4, 7, 2) 
>>> obj1 + obj2 
Add_obj(6, 12, 2) 
+0

'lambda x、y:x + y'を' operator.add'の両側で使用し、1つのインポートを保存することもできます。 –

+0

'operator.add'で' map'を選択したのは速いからです。あなたの 'lambda'を使うと、パフォーマンスの目的を破ります。 – MSeifert

1

zipを使用することをお勧めしました。

class Add_obj: 
    def __init__(self, *num): 
     self.num = num 

    def __repr__(self): 
     return 'Add_obj{}'.format(self.num) 

    def __add__(self, other): 
     return Add_obj(*(sum(pair) for pair in zip(self.num, other.num))) 


obj1 = Add_obj(2, 5) 
obj2 = Add_obj(4, 7) 
obj3 = obj1 + obj2 

print(obj1) 
print(obj2) 
print(obj3) 
+0

正確な構文 'sum(pair)in pair in ...を提案しようとしていた'もう一つの答えには、私はこれを+1するつもりだと思う。 –

関連する問題