当实例属性发生变化时如何更新类属性?

问题描述 投票:0回答:2

我正在研究优化问题。如您所知,优化是一个迭代过程。选择一些部分,计算所有部分的权重。

我有这样的代码:

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

python class instance-variables class-attributes renewal
2个回答
1
投票

如果您希望对实例属性进行修改以影响类属性的值,您可以将实例属性设为 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

演示:https://ideone.com/pqUN4w


-1
投票

在您当前的实现中,属性

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

© www.soinside.com 2019 - 2024. All rights reserved.