在类对象中,如何自动更新属性?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在类对象中,如何自动更新属性?相关的知识,希望对你有一定的参考价值。
我有一个具有多个相关属性的类,例如:
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.list
和a.listsquare
。
现在,如果我想首先创建一个空对象,并为其分配一个属性,我希望其他属性自动更新,例如,如果我这样做
b = SomeClass()
b.list = range(5,10)
我希望b.listsquare
能够自动更新,反之亦然(指定b.listsquare
和自动更新b.list
)。这可能吗? Class是正确的选择吗?
谢谢大家,但我完全被所有不同的答案所震撼。任何人都可以提供完整的解决方案,这样我就可以自学了吗?
我想实现一个类Foo
有3个属性length
,list
和listsquare
这样:
- 如果我做qazxsw poi,我会得到qazxsw poi,qazxsw poi,qazxsw poi。
- 如果我做qazxsw poi,我会得到qazxsw poi,qazxsw poi。
- 如果我做qazxsw poi,我会得到qazxsw poi,qazxsw poi。
答案
如果由于对另一个属性的更新而更新一个属性是您正在寻找的(而不是在访问时重新计算下游属性的值)使用属性setter:
a = Foo(3)
另一答案
绝对。但请改用a.length = 3
。
a.list = [0, 1, 2]
对属性值的缓存留给读者练习。
另一答案
您也可以使用setter方法,如下所示:
a.listsquare = [0, 1, 4]
另一答案
Ignacio的@property解决方案非常棒,但每次引用listsquare时它都会重新计算列表 - 这可能会变得很昂贵。 Mathew的解决方案很棒,但现在你有功能调用。您可以将这些与“属性”功能结合起来。在这里,我为my_list定义了一个getter和一个setter(我不能称之为'list'!),它生成了listsquare:
b = Foo().list = [5, 6]
这输出:
b.length = 2
以上是关于在类对象中,如何自动更新属性?的主要内容,如果未能解决你的问题,请参考以下文章