如何实现NodeList的all()方法以直接批量设置内部所有Node对象属性
实现方案
完全可以实现,核心是让all()方法返回的不是原生列表,而是自定义的代理容器类,通过重写属性赋值魔术方法实现批量赋值逻辑。
核心代码实现
- 首先定义代理集合类,接管属性赋值逻辑
class NodeCollectionProxy: def __init__(self, node_list): # 存储内部维护的Node对象列表,私有属性不参与批量赋值逻辑 self._nodes = node_list def __setattr__(self, attr_name, value): # 私有属性走默认赋值规则 if attr_name.startswith("_"): super().__setattr__(attr_name, value) return # 非私有属性批量赋值给所有Node对象 for node in self._nodes: setattr(node, attr_name, value)
- 修改
NodeList类的all()方法返回代理实例
class NodeList: # 此处保留你原有NodeList的其他实现逻辑 def all(self): # 原有逻辑是直接返回内部存储的Node列表,现在替换为返回代理类实例 return NodeCollectionProxy(self._internal_node_storage)
使用效果
完成上述修改后,你期望的a.b.c.d.e.all().val = <val>语法即可正常生效,不需要额外写显式循环或者推导式,会自动将赋值同步到所有Node实例的对应属性上。
扩展能力
如果需要支持更多批量操作,可在NodeCollectionProxy中补充对应魔术方法即可:
- 实现
__getattr__可支持批量读取属性,比如all_val = a.b.c.d.e.all().val会返回所有节点val属性组成的列表 - 实现
__call__可支持批量调用方法,比如a.b.c.d.e.all().some_method(arg)会调用所有节点的对应方法
内容的提问来源于stack exchange,提问作者Benjamin Crawford Ctrl-Alt-Tut
相关产品推荐
相关产品推荐

