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

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.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。
答案

如果由于对另一个属性的更新而更新一个属性是您正在寻找的(而不是在访问时重新计算下游属性的值)使用属性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

以上是关于在类对象中,如何自动更新属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何从类函数内部访问对象属性[重复]

如何在 Vs Code 中更改默认自动选择的用户片段行为

Python全栈自动化系列之Python编程基础(类讲解)

关于CSS的个人理解

面向对象特征

vue中detele删除对象属性时视图不能响应更新 - 解决办法