我可以覆盖Python列表显示吗?

2024-03-28 18:11:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我想更改Python列表显示的行为,这样就不会生成list,而是生成我编写的list的子类。(注:我不认为这是个好主意;我这样做是为了好玩,而不是实际使用。)

以下是我所做的:

old_list = list

class CallableList(old_list):
    def __init__(self, *args):
        old_list.__init__(self)
        for arg in args:
            self.append(arg)
    def __call__(self, start, end=None):
        if end:
            return self[start:end]
        return self[start]

list = CallableList

完成后,将返回列表的第三个元素:

^{pr2}$

但这仍然会产生一个错误:

x = [1, 2, 3]
print x(2)

错误很简单:

Traceback (most recent call last):
  File "list_test.py", line 23, in <module>
    print x(2)
TypeError: 'list' object is not callable

我肯定不会这么做的,但我肯定不会这么做。有什么想法吗?在


Tags: inself列表returninitdef错误arg
3条回答

您不能从Python中更改它。像list comprehension这样的构造总是使用内置的list类型,而不是您在当前名称空间中定义的单词list的任何内容。如果要更改内置类型,则必须编辑Python源代码并重新编译。假设您使用的是CPython实现,它位于Objects/listobject.c。在

不能简单地重写用于内置类型的语法糖,因为这发生在编译器级别。总是显式调用构造函数。在

   >>> print(x(2)) # works in 2.7
   3
   >>> type(x)
   <class '__main__.CallableList'>
   >>> y = [1,2,3]
   >>> type(y)
   <type 'list'>

所以您并没有真正地重新定义类型“list”,您只更改了名称空间,使type list的list()方法现在与您的类型CallableList类型发生冲突。为了避免这种情况

^{pr2}$

相关问题 更多 >