相对尖锐的问题。目前正在运行Python 3.4.1,我正在进行面向对象的练习,我需要从继承的类中覆盖一些函数。
目标: 从内置模块集合导入并利用collections.UserList重写append,extend,以便它不会添加"如果检测到任何重复。 (这部分完成了)
问题: 主要的问题是我还在学习面向对象的编程,我想构建可以轻松输入和返回的对象,所以我正在为我写一个 str 和 repr 类
目前我的班级如下所示:(省略了"目标"因为它有效,所以
import collections
class UList (collections.UserList):
def __init__(self, entry =[]):
self.entry = entry
def __str__ (self):
print (self.entry)
return
def __repr__(self):
return self.__str__()
然后我决定运行一些示例代码以获得良好的衡量标准:
>>> x = UList ([4,5,6])
>>> x.entry
[4, 5, 6]
>>> x
[4, 5, 6]
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
x
TypeError: __repr__ returned non-string (type NoneType)
>>> print(x)
[4, 5, 6]
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
print(x)
TypeError: __str__ returned non-string (type NoneType)
通常我会直视对象并尝试弄清楚出了什么问题,但我有点困惑,因为我还是新的=(。有人可以解释为什么即使在我覆盖了 init ?(还有一个可能的解决方案,我可以如何纠正,所以没有错误会非常有帮助)
答案 0 :(得分:2)
考虑(注意return
末尾没有明确的__str__
):
>>> class Foo:
... def __str__(self):
... print('Foo!!')
...
>>> f=Foo()
>>> f
<__main__.Foo object at 0x10a655080>
>>> print(f)
Foo!!
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __str__ returned non-string (type NoneType)
Vs的:
>>> class Foo:
... def __str__(self):
... return 'Foo!!!'
...
>>> f=Foo()
>>> print(f)
Foo!!!
问题是__repr__
和__str__
需要返回一个返回字符串。如果可能,__repr__
的返回应该是eval
根据{{3}上的文档重新创建对象或其他<useful definition>
的对象的“官方”字符串表示形式}
__repr__上的文档可以使用'更方便或简洁的表示',而不是Python表达式。