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

使用__getattribute__实现类属性处理时遇AttributeError问题求助

问题分析与解决

错误根源

你的__getattribute__方法会拦截所有属性访问操作,包括在__init__方法中对self.lst的访问。当你在__init__里执行self.lst.append(...)时,__getattribute__已经生效,它会返回self.txt(此时是空字符串),而字符串没有append方法,因此抛出AttributeError。

修正方案

我们需要将实际存储字符串列表的属性和对外暴露的lst属性区分开,用一个内部属性(比如_real_lst)来保存原始提取的字符串,仅在外部访问lst时通过__getattribute__返回首字符拼接结果。同时优化类型判断和循环写法,让代码更规范:

class Myclass:
    def __init__(self, L):
        # 用内部属性存储实际的字符串列表,避免被__getattribute__拦截
        self._real_lst = []
        self.txt = ""

        if isinstance(L, list):
            # 直接遍历元素,更Pythonic
            for item in L:
                if isinstance(item, str):
                    self._real_lst.append(item)
            
            # 拼接首字符
            for s in self._real_lst:
                self.txt += s[0]

    def __getattribute__(self, name):
        if name == "lst":
            # 外部访问lst时返回拼接后的首字符串
            return object.__getattribute__(self, "txt")
        else:
            return object.__getattribute__(self, name)


objA = Myclass([1, 2, 3, 4, 5, "something", "word"])
print(objA.lst)  # 输出: sw
print(objA.txt)  # 输出: sw

关键说明

  1. 内部属性隔离:用_real_lst存储实际提取的字符串列表,__init__中操作这个属性不会被__getattribute__拦截,避免了字符串调用append的错误。
  2. 类型判断优化:用isinstance()代替type(),因为isinstance()能正确处理子类继承的情况(比如自定义字符串子类),更符合Python的类型检查规范。
  3. 循环写法优化:直接遍历列表元素而非通过range(len(L))索引访问,代码更简洁易读。

内容的提问来源于stack exchange,提问作者Simone Samardhziev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 00:05:10