如果您想更改某个属性的类on change中的其他变量,只需为其编写一个property即可。如果你有一个简单的数据类型,那就很好用了。但是,如果您的变量包含像list这样的复杂类型(并不是那么不典型),则无需再次调用variable.setter即可更改内容本身。
是否有任何回调或事件可用于跟踪对类的列表属性的更改?还能做些什么来保持代码的整洁而不破坏类的内部功能呢?
示例:
class Accumulator(object)
def __init__(self,all_things):
# :param all_things: a list of stuff of any kind
self.__all_things = all_things
@property
def all_things(self):
return self.__all_things
@all_things.setter
def all_things(self,input):
self.__all_things = input跳出框框思考可能是解决之道。当务之急不是保持类结构的活性,而是找到一种工作模式,并允许一个干净的API!
发布于 2012-08-13 16:19:15
您必须使用list的自定义子类来检测更改:
class MyList(list):
on_change_callback = None
def _notify(self):
if self.on_change_callback is not None:
self.on_change_callback(self)
def __setitem__(self, index, value):
super(MyList, self).__setitem__(self, index, value)
self._notify()
# Etc, each mutating method needs to be overridden.您需要覆盖每个变异方法,调用原始方法(通过super()),然后调用self._notify()。有关方法的列表,请参阅Emulating container types部分。
发布于 2012-08-13 16:39:49
为了允许讨论和增加创造力,我想自己提供以下解决方案:
class Accumulator(object):
def __init__(self,all_things):
#:param all_things: a sequence or generator of stuff of any kind
self.__all_things = tuple(all_things)
@property
def all_things(self):
return self.__all_things
@property
def all_things(self, all_things):
self.__all_things = tuple(all_things)它是干净的,它是只读的,不会出错或被误用。现在,同样的假设也适用于问题的结构:如果你想改变它,你需要重置它。但你不必告诉用户,因为这是他唯一的机会。如果用户仍然想知道为什么,他可以读取希望冗长的类文档字符串。
https://stackoverflow.com/questions/11930096
复制相似问题