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)
あなたはまだ学んでいる間、あなたは、Python 3.6に切り替える必要があります - それはバージョン2.xに改良したものである - https://pythonclock.org/ – wwii
'self.num'は何ですか?シーケンスまたは単一の数字?たぶんdocstringを '__init__'やクラス自体に追加することができます。まず、forループに 'i'を表示して、あなたが何を持っているかを見てから、何をするのかを考えてみてください。 – wwii
あなたの試行と両方の答えに注意するべきことがあります。二つのオブジェクトの長さが 'num'の長さが異なる場合、' zip'を使うとより長い 'num'が切り捨てられます。したがって、異なるサイズのオブジェクトを追加することはできますが、これは意図された動作であるとは考えにくいです。 2つのオブジェクトが同じ長さであることを明示的にサニティチェックしたり、必要に応じて短いオブジェクトに0を埋め込むソリューションを使用したりすることもできます。 –