gpt4 book ai didi

python - __add__ 两个类对象

转载 作者:太空狗 更新时间:2023-10-30 02:38:38 27 4
gpt4 key购买 nike

我一直在通过搜索教程来学习 Python 2。我正在发现关于的事情。我在 __add__ dunder-method 中遇到了一些麻烦。我不知道如何添加 一个类的 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 个对象的最佳方式吗?

最佳答案

您可以将 mapoperator.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))

它确实返回了“预期的对象”:

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

但是 map 并不是真正需要的,它只是实现此目的的一种非常高效且简短的方法。您也可以改用理解和 zip:

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

正如评论中指出的那样,这也可以工作,但当两个 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

或者您可以用零填充较短的:

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 - __add__ 两个类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46407931/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com