Форум сайта python.su
0
Допустим имеется код:Код Python
class Mylist(list): pass
y = Mylist('abc')
Я правильно понимаю что встроенные типы в python также являются полноценными классами(наровне с пользовательскими классами), т.е объекты, например, списка являются экземплярами класса list? Выражение list('abc') по сути является вызовом констуктора класса list. А как методы встроенных типов обрабатывают экземпляры пользовательских классов? Например, в выражении y = Mylist('abc'), как обычно, должен создаваться экземпляр класса Mylist, но метод __init__ наследуюмый из класса не возвращает экземпляр класса, а возвращает тип список. Т.е на какое значение будет ссылаться переменная у непонятно
Офлайн
253
class Ta(list): pass a=Ta() print(type(a)) >>> <class '__main__.Ta'>
MaksimНет он возвращает ваш тип.
а возвращает тип список
>>> id(a) 19435664
Отредактировано doza_and (Март 9, 2014 19:40:44)
Офлайн
0
А почему он возвращает мой тип если выражение Mylist('abc') возвращает тип списка? Т.е он одновременно является экземпляром класса Mylist и списком чтоли?
Офлайн
33
Maksim
А почему он возвращает мой тип если выражение Mylist('abc') возвращает тип списка?
Офлайн
857
Maksim
Я правильно понимаю что встроенные типы в python также являются полноценными классами(наровне с пользовательскими классами)
>>> list <class 'list'> >>>
Maksim
т.е объекты, например, списка являются экземплярами класса list?
>>> type([]) <class 'list'> >>>
Maksimlist.__new__ - это конструктор
Выражение list('abc') по сути является вызовом констуктора класса list
Maksim
но метод __init__ наследуюмый из класса не возвращает экземпляр класса, а возвращает тип список
>>> class List(list): ... pass ... >>> lst = List([]) >>> lst [] >>> type(lst) <class '__main__.List'> >>>
>>> class List(list): ... def __repr__(self): ... return '<' + super().__repr__() + '>' ... >>> lst = List([]) >>> lst <[]> >>> lst.append(3) >>> lst <[3]> >>>
Maksimкогда наследуешь от списка, то получаешь класс, экземпляры которого очень похожи на списки, прямо один в один
Т.е он одновременно является экземпляром класса Mylist и списком чтоли?
Офлайн
33
py.user.next
list.__new__ - это конструктор
Офлайн
857
Budulianinпотому что __init__ - это не конструктор, а инициализатор
Почему не list.__init__ ?
Офлайн
33
py.user.next
В русскоязычной литературе, всегда пишут, что __init__ в Python это конструктор.
Ещё видел, что про __init__ говорили - “самый похожий на конструктор метод”(diveintopython)
Скорее всего правильнее сказать, что в Python, конструктор разделён на два метода __new__ и __init__, но не называть только один из них конструктором.
Офлайн
857
Budulianinэто не конструктор
В русскоязычной литературе, всегда пишут, что __init__ в Python это конструктор.
Budulianin
Скорее всего правильнее сказать, что в Python, конструктор разделён на два метода __new__ и __init__, но не называть только один из них конструктором.
>>> class A: ... def __init__(self): ... self.i = 1 ... def __new__(cls): ... return [] ... >>> a = A() >>> a [] >>> a.i Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'list' object has no attribute 'i' >>>
Budulianinты не заметил, что в предыдущем сообщении дана ссылка на место, где описывается это ?
Ещё видел, что про __init__ говорили - “самый похожий на конструктор метод”(diveintopython)
Отредактировано py.user.next (Март 10, 2014 02:43:07)
Офлайн
33
py.user.next
это не конструктор
py.user.next
ты не заметил, что в предыдущем сообщении дана ссылка на место, где описывается это ?
py.user.next__new__ не инициализирует атрибуты класса, __init__ не создает объект, поэтому я сказал “конструктор разделён на два метода” и привёл ссылку.
какой это конструктор, если он не создаёт объект ?
Офлайн