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
相关产品推荐
相关产品推荐

