Python 中没有办法在全局或本地范围内自动重新绑定名称以响应其他名称被重新绑定。但是,应该可以创建一个可以跟踪某些值并具有返回您调用的值的成员函数的类A
。而且,正如@Alok 指出的那样,您可以使用属性描述符来创建隐式调用函数以返回其值的成员名称,因此您可以隐藏函数并将名称视为普通的旧名称。
class Trk(object):
"""Track some values and compute a function if any change"""
def __init__(self, name, fn, **objects_to_track):
def _trk_fn(self):
if any(self.__dict__[x] != self.original_objects[x] for x in self.original_objects):
self.value = self.saved_fn(self.__dict___)
# now that self.value is updated, also update self.original_objects
for x in self.original_objects:
self.original_objects[x] = self.__dict__[x]
return self.value
self.original_objects = objects_to_track # make reference copy
self.__dict__.update(objects_to_track)
self.name = name
self.saved_fn = fn
self.fn = self._trk_fn()
self.value = self.fn()
很抱歉,我现在很累,无法完成这个示例。我也没有测试它。但这显示了一种跟踪值的方法,如果它们不同,则做不同的事情。你像这样使用它:
# want to track x, y, z
trk = Trk(x, y, z)
trk.fn() # returns up-to-date value
trk.x = new_value
trk.fn() #detects that trk.x changed and computes new trk.value
如果上述方法有效,您可以使用属性描述符来绑定名称,以便尝试从名称中读取值将调用self.fn()
编辑:哦,重要的是什么时候self.value
更新,self.original_objects
应该更新。我已经添加了代码来做到这一点。
现在我要睡觉了!