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

OOP继承场景下eval(repr())触发AttributeError问题咨询

解决Queue2类eval(repr())触发AttributeError的问题

这个问题我之前处理过,核心原因是默认的repr()方法没有生成能重建Queue2实例的字符串,导致eval后得到的是普通list对象,而非Queue2实例,自然找不到你定义的那些方法。

问题根源

当你继承自list时,Queue2类会继承list的__repr__方法,这个方法返回的是类似['a','b','c']的字符串。当你执行eval(repr(queue2))时,Python会把这个字符串解析成一个标准的list对象,而不是Queue2实例。所以当你尝试调用duplicate.isEmpty()这类Queue2独有的方法时,就会触发AttributeError——因为普通list根本没有这个方法。

解决方法:重写__repr__方法

你需要在Queue2类中自定义__repr__方法,让它生成能直接重建Queue2实例的字符串。修改后的类如下:

class Queue2(list):
    'a queue class, subclass of list'
    def isEmpty(self):
        'returns True if queue is empty, False otherwise'
        return (len(self)==0)
    def dequeue(self):
        'remove and return item at front of queue'
        return self.pop(0)
    def enqueue(self, item):
        'insert item at rear of queue'
        return self.append(item)
    
    def __repr__(self):
        # 调用父类的__repr__获取列表内容,再包裹成Queue2的构造调用
        return f"Queue2({super().__repr__()})"

测试验证

现在再执行你的测试代码:

queue2 = Queue2(['a','b','c'])
duplicate = eval(repr(queue2))
# 检查duplicate的类型
print(type(duplicate))  # 输出:<class '__main__.Queue2'>
# 调用Queue2的方法
print(duplicate.isEmpty())  # 输出:False
duplicate.enqueue('d')
print(duplicate.dequeue())  # 输出:a

这样就不会再触发AttributeError了,因为eval(repr(queue2))现在会正确创建一个Queue2实例。

额外说明

__repr__的设计目标是生成可用于重建对象的官方字符串表示,所以对于自定义类,尤其是继承自内置类型的类,重写这个方法是很有必要的,能保证对象的序列化/反序列化行为符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:22:34