You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:35:11