我知道__add__
覆盖加号的方法,但是当我用它来覆盖+ =时,我最终遇到两个问题之一:
(1)如果__add__
变异自我,那么
z = x + y
Run Code Online (Sandbox Code Playgroud)
当我不想让x在那里变异时,我会改变x.
(2)如果__add__
返回一个新对象,那么
tmp = z
z += x
z += y
tmp += w
return z
Run Code Online (Sandbox Code Playgroud)
将返回没有w的东西,因为z和tmp在z += x
执行后指向不同的对象.
我可以制作某种.append()
方法,但+=
如果有可能,我宁愿超载.
我想为我创建的每个对象创建一个唯一的ID - 这是类:
class resource_cl :
def __init__(self, Name, Position, Type, Active):
self.Name = Name
self.Position = Position
self.Type = Type
self.Active = Active
Run Code Online (Sandbox Code Playgroud)
我希望有一个self.ID,每次我创建一个新的类引用时自动递增,例如:
resources = []
resources.append(resource_cl('Sam Sneed', 'Programmer', 'full time', True))
Run Code Online (Sandbox Code Playgroud)
我知道我可以参考resource_cl,但我不确定如何从那里开始......
从我从我的C++类记得,教授说,操作符重载是很酷,但因为它需要比较大量的思想和代码覆盖所有终端的情况下(如过载时,+
你可能还需要过载++
和+=
,也使确保处理最终情况,例如向对象添加对象等.),您应该只考虑在此功能会对您的代码产生重大影响的情况下,例如在数学应用程序中重载矩阵类的运算符.
这同样适用于python吗?你会建议在python中覆盖运算符行为吗?你能给我什么经验法则?
Python中有没有一种方法可以初始化一个变量,以便它可以与+= "a string"
或一起工作+= 100
使用?\n例如:
a = <what to put here>\na += 100 # a = 100\nb = <same what to put here from above> \nb += "a string" # b = "a string"\n
Run Code Online (Sandbox Code Playgroud)\n如果我使用:
\na = ""\na += "a string" # this will work fine\nb = ""\nb += 0 # -> TypeError\n
Run Code Online (Sandbox Code Playgroud)\n一旦定义了变量的类型,TypeError
如果我尝试+=
不同的类型,之后就可以得到 a 。例如:
a = <what to put here>\na += "a string" # a = …
Run Code Online (Sandbox Code Playgroud) 我写了这段代码来说明问题。在代码本身下方,您可以看到控制台打印输出。
在我的程序中,Polygon 类对象将顶点坐标存储在指向每个顶点的向量列表中。Translate() 函数所要做的就是迭代列表中的每个向量并将参数向量添加到每个项目。很简单,对吧?
Vector 类有自己的重载__add__
函数。
当我编写和测试代码时,我发现该列表的成员仅在我迭代时才会更改。完成后,所有坐标都会恢复为原始值。
在我发现这个问题之后,凭直觉我做了另一个函数 - Manual_Translate(),它手动计算向量分量(不调用 Vector。__add__
)
class Vector():
def __init__(self, X, Y):
self.x = X
self.y = Y
def __add__(self, Other_Vector):
return Vector((self.x + Other_Vector.x),(self.y + Other_Vector.y))
class Polygon():
def __init__(self, point_list):
self.Points = []
for item in point_list:
self.Points.append (Vector(item[0], item[1]))
def Translate (self, Translation):
for point in self.Points:
point += Translation
print (point.x, point.y) #printout from the same loop
def Manual_Translate (self, Translation):
for point in self.Points:
point.x += …
Run Code Online (Sandbox Code Playgroud)