Python中如何设置名称包含索引的属性?
解决方法
首先明确错误根源:obj.worldMatrix[0]的执行逻辑是先获取obj.worldMatrix(这是一个AttrClass实例),然后尝试对该实例执行下标访问操作,但AttrClass未实现__getitem__方法,因此触发报错。而你实际想要访问的是obj对象中名为worldMatrix[0]的属性,但Python语法中obj.a[b]并不会直接映射到obj的a[b]属性,而是对obj.a进行下标操作。
要实现obj.worldMatrix[0]的调用语法,需要做两处修改:
1. 修正AttrClass的初始化参数
原代码中AttrClass接收的node参数是字符串类型的节点名称,无法用来访问宿主NodeClass实例的属性。需要改为传入NodeClass的实例本身:
class NodeClass(): def __init__(self): self.name = "NodeName" self.set() def set(self): for i in ["worldMatrix", "worldMatrix[0]", "worldMatrix[1]"]: attr_dict = {"attribute": i} # 将self.name替换为self,传入NodeClass实例 setattr(self, i, AttrClass(self, **attr_dict))
2. 在AttrClass中实现__getitem__方法
该方法会在对象被下标访问时触发,我们可以在方法中构造对应的属性名,然后从宿主NodeClass实例中获取目标属性:
class AttrClass(): def __init__(self, node, **kwargs): self.att = kwargs.get("attribute") self.node = node # 现在node是NodeClass实例 def set_matrix(self, matrix=None): if not matrix: matrix = [1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0] # 原逻辑返回节点名称,此处改为从实例中获取name属性 return self.node.name, self.att, matrix def __getitem__(self, key): # 构造目标属性名,例如从"worldMatrix"和0生成"worldMatrix[0]" attr_name = f"{self.att}[{key}]" try: return getattr(self.node, attr_name) except AttributeError: raise KeyError(f"节点{self.node.name}不存在属性{attr_name}")
测试修改后的代码
现在执行以下代码将不再报错:
obj = NodeClass() obj.worldMatrix.set_matrix() obj.worldMatrix[0].set_matrix() obj.worldMatrix[1].set_matrix()
本质上是通过__getitem__方法,将对worldMatrix实例的下标访问,转换为对宿主NodeClass实例对应属性的获取,从而实现你想要的调用语法。
内容的提问来源于stack exchange,提问作者IKA
相关产品推荐
相关产品推荐

