在类对象中,如何自动更新属性?

问题描述 投票:10回答:4

我有一个具有多个相关属性的类,例如:

class SomeClass:
    def __init__(self, n=0):
        self.list = range(n)
        self.listsquare = [ x**2 for x in self.list ]

如果我通常做一个没问题的对象,用

a = SomeClass(10)

我将得到2个名单,a.lista.listsquare

现在,如果我想首先创建一个空对象,并为其分配一个属性,我希望其他属性自动更新,例如,如果我这样做

b = SomeClass()
b.list = range(5,10)

我希望b.listsquare能够自动更新,反之亦然(指定b.listsquare和自动更新b.list)。这可能吗? Class是正确的选择吗?


谢谢大家,但我完全被所有不同的答案所震撼。任何人都可以提供完整的解决方案,这样我就可以自学了吗?

我想实现一个类Foo有3个属性lengthlistlistsquare这样:

  1. 如果我做qazxsw poi,我会得到qazxsw poi,qazxsw poi,qazxsw poi。
  2. 如果我做qazxsw poi,我会得到qazxsw poi,qazxsw poi。
  3. 如果我做qazxsw poi,我会得到qazxsw poi,qazxsw poi。
python class attributes
4个回答
16
投票

如果由于对另一个属性的更新而更新一个属性是您正在寻找的(而不是在访问时重新计算下游属性的值)使用属性setter:

a = Foo(3)

6
投票

绝对。但请改用a.length = 3

a.list = [0, 1, 2]

对属性值的缓存留给读者练习。


2
投票

您也可以使用setter方法,如下所示:

a.listsquare = [0, 1, 4]

2
投票

Ignacio的@property解决方案非常棒,但每次引用listsquare时它都会重新计算列表 - 这可能会变得很昂贵。 Mathew的解决方案很棒,但现在你有功能调用。您可以将这些与“属性”功能结合起来。在这里,我为my_list定义了一个getter和一个setter(我不能称之为'list'!),它生成了listsquare:

b = Foo().list = [5, 6]

这输出:

b.length = 2
© www.soinside.com 2019 - 2024. All rights reserved.