python - 求和重载
问题描述
我想要 3 个不同对象的总和,例如:
`2 3 4
2 3 4
2 3 4
6 9 12`the summation must be like this
并试图做到这一点
`
class mymath:
def __init__(self,x,y,z):
self.x=x
self.y=y
self.z=z
def __add__(self,other):
return self.x+other.x, self.y+other.y, self.z+other.z
x=mymath(2,7,6)
y=mymath(4,3,8)
z=mymath(2,4,6)
print(x+y+z)
解决方案
您正在返回一个元组,该元组没有__add__()
重载方法。您应该返回一个mymath
对象:
class mymath:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
def __add__(self, other):
return mymath(self.x + other.x, self.y + other.y, self.z + other.z)
def __str__(self):
return "({}, {}, {})".format(self.x, self.y, self.z)
x = mymath(2, 7, 6)
y = mymath(4, 3, 8)
z = mymath(2, 4, 6)
print(x + y + z) # Result: (8, 14, 20)
编辑:澄清评论后添加的解决方案
每个+
标志都转化为一个__add__()
呼叫。在您的示例中,该操作x + y + z
实际上是对__add__()
:执行两次调用x.__add__(y).__add__(z)
。
在表达式中添加括号可能会有所帮助:x + y + z
实际上转换为(x.__add__(y)).__add__(z)
.
问题发生在对 的第二次调用中__add__()
,因为您的方法返回self.x + other.x, self.y + other.y, self.z + other.z
的是元组(self.x + other.x, self.y + other.y, self.z + other.z)
(您可以在代码中省略括号,而且它更像 Python,但它是等价的,它实际上是一个元组)。
元组是一个固定长度的元素列表,它是 Python 语言的基本类。你可以在这里阅读更多关于它的信息。
的结果x.__add__(y)
是您期望的总和x + y
,但类型为tuple
。在示例中,(6, 10, 14) == (2 + 4, 7 + 3, 6 + 8)
你可以检查这个运行你的代码,但只打印x + y
print(x + y) # Prints (6, 10, 14)
并且:
print(type(x + y)) # Prints <class 'tuple'>
但是,第二个加法失败了,因为第一个加法的结果是一个元组而不是一个mymath
对象。所以(x + y) + z
实际上是调用__add__()
元组的方法,它存在但具有与您想要的含义不同的含义。因此,您正在获得错误TypeError: can only concatenate tuple (not "mymath") to tuple
请注意,添加两个元组只是附加它们,而不是逐元素添加坐标:(1, 2, 3) + (4, 5, 6) ==> (1, 2, 3, 4, 5, 6)
这个问题的解决方案是返回一个mymath
对象作为__add__()
操作的结果,允许连接多个加法操作。
我将该__str__()
方法添加到您的类中,否则打印只是显示类的默认表示形式,例如<__main__.mymath object at 0x7f8654657390>
.
推荐阅读
- amazon-web-services - 为什么通过 cdk 向 dynamodb 表添加二级索引需要重新创建表?
- javascript - 检查另一个类中的类的实例是否有一些负面影响?
- python-3.x - 如何分隔从文本文件中读取的数据行?客户与他们的订单
- c# - 统一武器开关
- java - java中的计划任务组多线程执行
- graphql - 有没有办法通过查询自省来读取类型上的 GraphQL 指令?
- java - 编写代码以从任何日期获取一周中的某一天
- android - Android 在深色/浅色主题之间切换不起作用
- c# - 如何使用多个表(CRUD 项目).Net MVC
- c# - 使用 OpenAccess ORM 在数据库服务器端直接执行方法