代码之家  ›  专栏  ›  技术社区  ›  JasonFruit

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

  •  3
  • JasonFruit  · 技术社区  · 15 年前

    我想改变Python列表显示的行为,这样就不用生成 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
    

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

    x = list(1, 2, 3)
    print x(2)
    

    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
    

    3 回复  |  直到 15 年前
        1
  •  3
  •   Ignacio Vazquez-Abrams    15 年前

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

        2
  •  1
  •   Daniel Stutzbach Edward Leno    15 年前

    list 在当前命名空间中。如果要更改内置类型,必须编辑Python源代码并重新编译。假设您使用的是CPython实现,那么它就存在于 Objects/listobject.c

        3
  •  -1
  •   Richard Careaga    15 年前
       >>> print(x(2)) # works in 2.7
       3
       >>> type(x)
       <class '__main__.CallableList'>
       >>> y = [1,2,3]
       >>> type(y)
       <type 'list'>
    

    因此,您没有真正重新定义类型“list”,只是更改了名称空间,以便类型list的list()方法现在与类型CallableList类型冲突。为了避免这种情况,

       >>> fred = CallableList
       >>> type(fred)
       <type 'type'>
       >>> x = fred(1,2,3)
       >>> x
       [1, 2, 3]
       >>> print x(2)
       3
       >>>