如何在自定义__builtin__列表中使用[]?

时间:2017-01-25 23:54:48

标签: python python-2.7

我试图理解__builtin__在Python中是如何工作的。我的代码如下:

import __builtin__

class MyList(list):
    pass

__builtin__.list = MyList

a = [1,2,3,4,5]
b = list([1,2,3,4,5])

print 'A: ', type(a)
print 'B: ', type(b)

当我打印两个列表的类型时,我得到:

A:  <type 'list'>
B:  <class '__main__.MyList'>

为什么不是MyList类型的两个列表以及如何实现[]语法也可以是MyList类型?

1 个答案:

答案 0 :(得分:2)

如果您检查CPython解释器使用[]模块处理dis的方式,您会看到它生成BUILD_LIST指令:

>>> def x():
...     x = [1,2]
... 
>>> dis.dis(x)
  2           0 LOAD_CONST               1 (1)
              3 LOAD_CONST               2 (2)
              6 BUILD_LIST               2
              9 STORE_FAST               0 (x)
             12 LOAD_CONST               0 (None)
             15 RETURN_VALUE

相应的指令触发直接调用C函数PyList_New(它在ceval.c中处理):

2202        case BUILD_LIST:
2203            x =  PyList_New(oparg);

我认为如果CPython每次在list伪模块中搜索__builtin__构造函数时会在源代码中使用[],那么它会慢得多,所以这种行为可以被认为是优化。

所以你所要求的是在香草CPython中无法实现的。