Найти - Пользователи
Полная версия: Наследование встроенных типов
Начало » Python для новичков » Наследование встроенных типов
1 2 3
Maksim
Допустим имеется код:Код Python
class Mylist(list): pass
y = Mylist('abc')

Я правильно понимаю что встроенные типы в python также являются полноценными классами(наровне с пользовательскими классами), т.е объекты, например, списка являются экземплярами класса list? Выражение list('abc') по сути является вызовом констуктора класса list. А как методы встроенных типов обрабатывают экземпляры пользовательских классов? Например, в выражении y = Mylist('abc'), как обычно, должен создаваться экземпляр класса Mylist, но метод __init__ наследуюмый из класса не возвращает экземпляр класса, а возвращает тип список. Т.е на какое значение будет ссылаться переменная у непонятно
doza_and
class Ta(list):
    pass
a=Ta()
print(type(a))
>>> 
<class '__main__.Ta'>
Maksim
а возвращает тип список
Нет он возвращает ваш тип.
И ссылается он понятно на что
>>> id(a)
19435664
на PyObject с адресом 19435664
Maksim
А почему он возвращает мой тип если выражение Mylist('abc') возвращает тип списка? Т.е он одновременно является экземпляром класса Mylist и списком чтоли?
Budulianin
Maksim
А почему он возвращает мой тип если выражение Mylist('abc') возвращает тип списка?

Потому что с появлением new style классов, типы стали классами, а классы стали типами. Когда ты создаёшь класс, ты фактически создаёшь новый тип. Поэтому тип объекта носит имя, которое ты дал своему классу.
py.user.next
Maksim
Я правильно понимаю что встроенные типы в python также являются полноценными классами(наровне с пользовательскими классами)
>>> list
<class 'list'>
>>>

Maksim
т.е объекты, например, списка являются экземплярами класса list?
>>> type([])
<class 'list'>
>>>

Maksim
Выражение list('abc') по сути является вызовом констуктора класса list
list.__new__ - это конструктор
python.org. __new__
python.org. __init__
python.org. __del__

Maksim
но метод __init__ наследуюмый из класса не возвращает экземпляр класса, а возвращает тип список
>>> class List(list):
...   pass
... 
>>> lst = List([])
>>> lst
[]
>>> type(lst)
<class '__main__.List'>
>>>
просто наследуется и repr(), и str()

>>> class List(list):
...     def __repr__(self):
...         return '<' + super().__repr__() + '>'
... 
>>> lst = List([])
>>> lst
<[]>
>>> lst.append(3)
>>> lst
<[3]>
>>>

Maksim
Т.е он одновременно является экземпляром класса Mylist и списком чтоли?
когда наследуешь от списка, то получаешь класс, экземпляры которого очень похожи на списки, прямо один в один

Budulianin
py.user.next
list.__new__ - это конструктор

Почему не list.__init__ ?
py.user.next
Budulianin
Почему не list.__init__ ?
потому что __init__ - это не конструктор, а инициализатор
__init__ срабатывает у уже созданного объекта
dip3. __init__
Budulianin
py.user.next

В русскоязычной литературе, всегда пишут, что __init__ в Python это конструктор.
Ещё видел, что про __init__ говорили - “самый похожий на конструктор метод”(diveintopython)

Скорее всего правильнее сказать, что в Python, конструктор разделён на два метода __new__ и __init__, но не называть только один из них конструктором.

py.user.next
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)
ты не заметил, что в предыдущем сообщении дана ссылка на место, где описывается это ?
Budulianin
py.user.next
это не конструктор
py.user.next
ты не заметил, что в предыдущем сообщении дана ссылка на место, где описывается это ?

Читал я, то что там написано. Просто замечание написал, что почти везде __init__ называют конструктором.

py.user.next
какой это конструктор, если он не создаёт объект ?
__new__ не инициализирует атрибуты класса, __init__ не создает объект, поэтому я сказал “конструктор разделён на два метода” и привёл ссылку.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB