Попробуйте запустить код после того, как вы запустили опубликованный код
>>> testlist = list()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'mlist' object is not callable
Теперь определите тип, используя опубликованный код
>>> type([])
<type 'list'>
>>> type(list)
<class '__main__.mlist'>
>>> type(testlist)
<type 'list'>
кажется, что []
создает list
, вместо mlist
, это выглядит странно: S
Обновление
Я проверил байт-код, созданный с помощью dis
, и кодниже было сгенерировано
>>> import dis # python's disassembler
>>> def code1():
... return []
...
>>> dis.dis(code1)
2 0 BUILD_LIST 0
3 RETURN_VALUE
>>> def code2():
... return list()
...
>>> dis.dis(code2)
2 0 LOAD_GLOBAL 0 (list)
3 CALL_FUNCTION 0
6 RETURN_VALUE
Похоже, что list
вызовет все, что ему назначено, а []
будет преобразован в BUILD_LIST
байт-код.Похоже, что []
не переводится в list
, следовательно, поведение []
привязано к созданию списка.
Обновление 2
Класс Python можетбыть обновленным
>>> class NewList(list):
... pass
...
>>> a = NewList()
>>> a.append(23)
>>> a[0]
23
>>> def double_getitem(self, key):
... return list.__getitem__(self, key) * 2
...
>>> NewList.__getitem__ = double_getitem
>>> a[0]
46
Ну, кроме встроенных классов, вроде списка
>>> list.__getitem__ = double_getitem
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't set attributes of built-in/extension type 'list'