在Python 3中使用集合模块

时间:2014-09-15 19:24:46

标签: python-3.x collections

相对尖锐的问题。目前正在运行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 ?(还有一个可能的解决方案,我可以如何纠正,所以没有错误会非常有帮助)

1 个答案:

答案 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表达式。