使用__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
关键说明
- 内部属性隔离:用
_real_lst存储实际提取的字符串列表,__init__中操作这个属性不会被__getattribute__拦截,避免了字符串调用append的错误。 - 类型判断优化:用
isinstance()代替type(),因为isinstance()能正确处理子类继承的情况(比如自定义字符串子类),更符合Python的类型检查规范。 - 循环写法优化:直接遍历列表元素而非通过
range(len(L))索引访问,代码更简洁易读。
内容的提问来源于stack exchange,提问作者Simone Samardhziev
相关产品推荐
相关产品推荐

