不使用循环时Python变量更新能否触发函数?类似Arduino attachInterrupt功能
答案
结论
Python完全可以实现类似Arduino attachInterrupt()的变量变更触发逻辑,不需要沿用高消耗的循环检测方案。
推荐实现方案
方案1:用@property实现类属性变更监听
适用场景:你要监听的变量可以封装为类成员的场景,无额外性能损耗,变量变更时同步触发回调。
代码示例:
class PersistentVariable: def __init__(self, init_value, file_path): self._val = init_value self.file_path = file_path self._write_to_file() @property def val(self): return self._val @val.setter def val(self, new_val): # 仅值发生变化时触发写入 if new_val != self._val: self._val = new_val self._write_to_file() def _write_to_file(self): with open(self.file_path, 'w', encoding='utf-8') as f: f.write(str(self._val)) # 使用示例 my_var = PersistentVariable(0, './variable_cache.txt') my_var.val = 15 # 变量赋值即自动触发写入操作
方案2:观察者模式实现多回调注册
适用场景:需要给单个变量注册多个变更回调,完全对齐Arduino attachInterrupt()的使用逻辑,你可以把回调注册方法理解为Python版的变量变更中断绑定。
代码示例:
class ObservableVariable: def __init__(self, init_value): self._val = init_value self._callback_list = [] # 对应attachInterrupt功能:注册变更触发的回调函数 def add_change_callback(self, callback): self._callback_list.append(callback) @property def val(self): return self._val @val.setter def val(self, new_val): if new_val != self._val: old_val = self._val self._val = new_val # 触发所有已注册的回调 for cb in self._callback_list: cb(old_val, new_val) # 写入文件的自定义回调 def save_change(old_val, new_val): with open('./change_log.txt', 'a', encoding='utf-8') as f: f.write(f"变量更新:{old_val} → {new_val}\n") # 使用示例 temp_var = ObservableVariable(25) # 绑定变更回调,和Arduino attachInterrupt逻辑完全一致 temp_var.add_change_callback(save_change) temp_var.val = 30 # 变更时自动调用save_change写入文件
特殊场景说明
如果你要监听的变量不受你的业务代码控制(比如来自硬件输入、第三方模块的内部变量),才需要考虑轮询方案,此时可以通过调低轮询频率、结合系统级IO事件监听(如select)来降低资源消耗。常规业务场景下上述两种方案就可以满足需求,没有额外的资源开销。
内容的提问来源于stack exchange,提问作者Masterbond7
相关产品推荐
相关产品推荐

