如何让ConnectedPin实例与另一实例始终同步(非拷贝场景)?
实现ConnectedPin实例的状态同步(类似Python dict的引用机制)
先搞懂Python dict的同步原理
Python里多个dict变量同步变化,本质是它们指向同一个内存地址的对象。比如:
a = {} b = a a["voltage"] = 3.3 print(b["voltage"]) # 输出3.3
这里a和b并不是两个独立的字典,而是存储了同一个dict对象的引用。所有对a的修改,都是直接修改这个共享的对象,b作为同一对象的引用,自然能看到最新状态——这是Python的对象引用模型决定的,变量存的是对象地址,而非对象副本。
针对ConnectedPin的实现方案
结合计算机模拟器的需求,推荐以下几种实用方案:
方案1:共享独立状态对象(最灵活)
把Pin的可变状态(比如电平、激活状态)抽成单独的状态类,所有关联的ConnectedPin实例都持有这个状态对象的引用。这样既可以让多个Pin共享状态,又能保留每个Pin的独立元数据(比如引脚编号、名称)。
class PinState: def __init__(self): self.level = 0 # 0=低电平,1=高电平 self.active = False self.voltage = 0.0 class ConnectedPin: def __init__(self, pin_id: str, state: PinState): self.pin_id = pin_id # 每个Pin独立的标识 self._state = state # 共享状态对象 # 通过属性封装,统一操作共享状态 @property def level(self): return self._state.level @level.setter def level(self, value): # 可添加模拟器专属校验逻辑,比如限制电平只能是0/1 if value not in (0, 1): raise ValueError("Pin level must be 0 or 1") self._state.level = value @property def voltage(self): return self._state.voltage @voltage.setter def voltage(self, value): self._state.voltage = value # 使用示例 power_state = PinState() pin_vcc = ConnectedPin("VCC_01", power_state) pin_mcu = ConnectedPin("MCU_VIN", power_state) pin_vcc.level = 1 print(pin_mcu.level) # 输出1,状态同步 pin_mcu.voltage = 3.3 print(pin_vcc.voltage) # 输出3.3,状态同步
方案2:直接共享ConnectedPin实例(最简单)
如果你的ConnectedPin不需要独立元数据,直接让多个变量指向同一个实例即可,完全复刻dict的逻辑:
class ConnectedPin: def __init__(self): self.level = 0 self.active = False # 使用示例 shared_pin = ConnectedPin() pin1 = shared_pin pin2 = shared_pin pin1.active = True print(pin2.active) # 输出True,直接同步
方案3:观察者模式(适合复杂场景)
如果模拟器需要状态变化时触发额外逻辑(比如日志记录、硬件联动),可以用观察者模式:让一个主Pin维护观察者列表,状态变化时通知所有关联Pin更新。不过这个方案复杂度更高,适合有扩展需求的场景。
class ConnectedPin: def __init__(self): self._level = 0 self._observers = [] def add_observer(self, observer): self._observers.append(observer) def _notify_observers(self): for observer in self._observers: observer.update(self._level) @property def level(self): return self._level @level.setter def level(self, value): self._level = value self._notify_observers() class PinObserver: def __init__(self): self.level = 0 def update(self, new_level): self.level = new_level # 使用示例 main_pin = ConnectedPin() pin1 = PinObserver() pin2 = PinObserver() main_pin.add_observer(pin1) main_pin.add_observer(pin2) main_pin.level = 1 print(pin1.level) # 输出1 print(pin2.level) # 输出1
内容的提问来源于stack exchange,提问作者Ever Keen
相关产品推荐
相关产品推荐

