我正在研究优化问题。如您所知,优化是一个迭代过程。选择一些部分,计算所有部分的权重。
我有这样的代码:
class Test:
W = 0
def __init__(self, l, A):
self.l = l
self.A = A
Test.W += self.A * self.l
instance1 = Test(5, 10)
instance2 = Test(3, 7)
instance3 = Test(6, 13)
print(Test.W)
instance1.A = 20
instance2.A = 30
instance3.A = 40
print(Test.W)
创建实例 1-3 时,程序计算出
W
为 149。它是正确的。
但如果我更改 A
值,结果会一次又一次地变为 149。
当我更改
W
或 A
时,如何更新类属性 l
?
如果您希望对实例属性进行修改以影响类属性的值,您可以将实例属性设为 property 并将附加逻辑放入其 setter 方法中:
class Test:
W = 0
def __init__(self, l, A):
self.l = l
self.A = A
@property
def A(self):
try:
return self._A
except AttributeError:
return 0
@A.setter
def A(self, value):
Test.W += (value - self.A) * self.l
self._A = value
这样:
instance1 = Test(5, 10)
instance2 = Test(3, 7)
instance3 = Test(6, 13)
print(Test.W)
instance1.A = 20
instance2.A = 30
instance3.A = 40
print(Test.W)
输出:
149
430
在您当前的实现中,属性
W
是所有类实例之间共享的类属性。修改单个实例的属性 A
或 l
不会影响计算的 W
,因为 W
在实例实例化期间仅计算一次。
如果您想在每次更改实例的
W
或 W
时重新计算 A
,您可以将 l
设为实例变量。
以下是修改课程的方法:
class Test:
def __init__(self, l, A):
self.l = l
self.A = A
self.W = self.A * self.l
instance1 = Test(5, 10)
instance2 = Test(3, 7)
instance3 = Test(6, 13)
print(instance1.W + instance2.W + instance3.W)
# Change A for instances
instance1.A = 20
instance2.A = 30
instance3.A = 40
# Recalculate W for each instance
instance1.W = instance1.A * instance1.l
instance2.W = instance2.A * instance2.l
instance3.W = instance3.A * instance3.l
print(instance1.W + instance2.W + instance3.W)
在此修改中,
W
是实例化期间计算的实例变量,当您更改A
或l
时,需要针对特定实例更新W
。