如果您想要更改属性的类on change
中的其他变量,您只需为其编写property
即可。如果你有一个简单的数据类型,这很好。但是,如果您的变量包含类似列表的复杂类型(不是那么不典型),则可以更改内容本身而无需再次调用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!
答案 0 :(得分:2)
您必须使用列表的自定义子类来检测更改:
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部分。
答案 1 :(得分:1)
为了进行讨论并提高创造力,我想自己提供以下解决方案:
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)
它很干净,它是只读的,没有任何错误或被滥用。现在同样的假设适用于问题的结构:如果你想改变它,你需要重置它。但你不必告诉用户,因为这是他唯一的机会。如果用户仍然想知道为什么,他可以阅读有希望的详细类docstring。