【发布时间】:2021-10-02 15:25:33
【问题描述】:
我见过这个堆栈溢出问题:link。我也想做同样的事情,但是如果可变属性是一个对象列表而不是一个对象呢?无论如何,该解决方案会起作用吗?问题是当有一个列表时,有时我想在列表的一个对象已更改或列表中的所有对象已更改时进行一些计算 - 问题是如果所有对象都已更改,我 不想希望每次更改列表中的项目时都重复计算,因为计算将是相同的,但只有当列表的所有值都更改时才有效。 p>
例如,
我不想要这个:
Set element[0] -> computation -> set element[1] -> computation ... -> set element[n-1] -> computation
我想要这个:
Set element[0] -> set element[1] -> set element[2] -> ... -> set element[n-1] -> computation
可以这样做吗?同时,我将尝试使用附加问题的代码,如果我有任何更新,我会通知您。
class Foomutable(object):
def __init__(self):
self.attr0 = 0
self.attr1 = 1
class Foo(object):
def __init__(self):
self.mutable = [Foomutable()]*4
def computation(self):
sum = 0.0
for mut in self.mutable:
sum += mut.attr0 * mut.attr1
return sum
@property
def mutable(self):
return self._mutable
@mutable.setter # Set attributes of mutable
def mutable(self, attrs):
# mutable is the list of objects
# Here if one or all the objects in mutable change the value of their attributes then
# do computation.
self.computation()
目前改变 mutable 的方式是循环每个元素改变它的一个或多个属性。
【问题讨论】:
-
这感觉就像您希望
element成为上下文管理器,其中项目在上下文打开时是可变的,而计算在上下文关闭时发生。 (这基本上是文件句柄的工作方式——您可以在它们打开时将大量单独的数据写入其中,并且将数据刷新到磁盘的最终“计算”发生在关闭时,以避免一堆小写。) -
是的@Samwise,我也是这么想的。我认为有一面旗帜是值得的。但我不知道这是否会在可变类或监视器可变类中。想法是,当标志为真(或可变类中的所有标志???)时,父级进行计算,计算后标志应再次设置为假
-
我不确定“监控可变类”是什么——如果您包含一个实际的类定义并指出您希望它如何工作,它可能会有所帮助!
-
添加了简短的python代码
-
您能否举例说明您希望如何使用
mutable属性?例如。您是在按照您的代码所暗示的那样做Foo.mutable = [1, 2, 3, 4],还是按照您的问题描述所暗示的那样尝试做Foo.mutable[0] = 1、Foo.mutable[1] = 2等?对于后者,我认为mutable需要通过__setitem__返回实现您正在寻找的语义的 another 对象。
标签: python properties attributes