如何通过通配符同时为Memory类中多个Register对象设置属性?
实现通配符批量设置寄存器属性的解决方案
你遇到的核心问题是:返回filter/生成器这类迭代器时,直接给它的value赋值只会修改迭代器本身的属性,而非每个目标寄存器的属性。要实现aMemory["registerName*"].value = 12这种简洁语法,我们可以用代理类来包装匹配到的寄存器集合,拦截属性赋值操作并批量应用。
具体实现代码:
首先定义代理类,负责批量处理属性操作:
class RegisterProxy: def __init__(self, registers): # 转成列表存储,避免迭代器只能遍历一次的限制 self._registers = list(registers) def __setattr__(self, name, value): # 跳过自身内部属性的设置,防止递归调用 if name == "_registers": super().__setattr__(name, value) return # 遍历所有匹配的寄存器,批量设置属性 for reg in self._registers: setattr(reg, name, value)
然后修改Memory类的__getitem__方法,返回代理对象而非迭代器:
import fnmatch class Register: def __init__(self, name): self.name = name self.value = 0 class Memory: def __init__(self): self._registers = {} # 初始化示例寄存器 self._registers["registerName1"] = Register("registerName1") self._registers["registerName2"] = Register("registerName2") self._registers["registerName3"] = Register("registerName3") def __getitem__(self, registerId): if '*' in registerId or '?' in registerId: matched_regs = filter( lambda r: fnmatch.fnmatch(r.name, registerId), self._registers.values() ) return RegisterProxy(matched_regs) return self._registers[registerId]
测试使用:
aMemory = Memory() # 批量设置匹配通配符的寄存器value aMemory["registerName*"].value = 12 # 验证结果 print(aMemory["registerName1"].value) # 输出 12 print(aMemory["registerName2"].value) # 输出 12 print(aMemory["registerName3"].value) # 输出 12
扩展功能(可选):
如果需要支持批量读取属性(比如获取所有匹配寄存器的value列表),可以给RegisterProxy添加__getattr__方法:
def __getattr__(self, name): return [getattr(reg, name) for reg in self._registers]
这样就能用all_values = aMemory["registerName*"].value获取所有匹配寄存器的value列表。
如果你觉得代理类实现稍显复杂,也可以选择写一个专门的批量设置方法(比如set_matching(pattern, **attrs)),但代理方案能完全满足你最初想要的简洁语法需求。
内容的提问来源于stack exchange,提问作者Betoneira
相关产品推荐
相关产品推荐

