我想更改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
我肯定不会这么做的,但我肯定不会这么做。有什么想法吗?在
您不能从Python中更改它。像list comprehension这样的构造总是使用内置的list类型,而不是您在当前名称空间中定义的单词
list
的任何内容。如果要更改内置类型,则必须编辑Python源代码并重新编译。假设您使用的是CPython实现,它位于Objects/listobject.c。在不能简单地重写用于内置类型的语法糖,因为这发生在编译器级别。总是显式调用构造函数。在
所以您并没有真正地重新定义类型“list”,您只更改了名称空间,使type list的list()方法现在与您的类型CallableList类型发生冲突。为了避免这种情况
^{pr2}$相关问题 更多 >
编程相关推荐