Уведомления

Группа в Telegram: @pythonsu

#1 Март 9, 2014 18:35:43

Maksim
Зарегистрирован: 2013-01-09
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование встроенных типов

Допустим имеется код:Код Python
class Mylist(list): pass
y = Mylist('abc')

Я правильно понимаю что встроенные типы в python также являются полноценными классами(наровне с пользовательскими классами), т.е объекты, например, списка являются экземплярами класса list? Выражение list('abc') по сути является вызовом констуктора класса list. А как методы встроенных типов обрабатывают экземпляры пользовательских классов? Например, в выражении y = Mylist('abc'), как обычно, должен создаваться экземпляр класса Mylist, но метод __init__ наследуюмый из класса не возвращает экземпляр класса, а возвращает тип список. Т.е на какое значение будет ссылаться переменная у непонятно

Офлайн

#2 Март 9, 2014 19:39:04

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Наследование встроенных типов

class Ta(list):
    pass
a=Ta()
print(type(a))
>>> 
<class '__main__.Ta'>
Maksim
а возвращает тип список
Нет он возвращает ваш тип.
И ссылается он понятно на что
>>> id(a)
19435664
на PyObject с адресом 19435664



Отредактировано doza_and (Март 9, 2014 19:40:44)

Офлайн

#3 Март 9, 2014 20:07:44

Maksim
Зарегистрирован: 2013-01-09
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование встроенных типов

А почему он возвращает мой тип если выражение Mylist('abc') возвращает тип списка? Т.е он одновременно является экземпляром класса Mylist и списком чтоли?

Офлайн

#4 Март 9, 2014 20:58:53

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Наследование встроенных типов

Maksim
А почему он возвращает мой тип если выражение Mylist('abc') возвращает тип списка?

Потому что с появлением new style классов, типы стали классами, а классы стали типами. Когда ты создаёшь класс, ты фактически создаёшь новый тип. Поэтому тип объекта носит имя, которое ты дал своему классу.



Офлайн

#5 Март 9, 2014 22:03:10

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Наследование встроенных типов

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 и списком чтоли?
когда наследуешь от списка, то получаешь класс, экземпляры которого очень похожи на списки, прямо один в один



Офлайн

#6 Март 9, 2014 22:28:00

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Наследование встроенных типов

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

Почему не list.__init__ ?



Офлайн

#7 Март 9, 2014 22:36:52

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Наследование встроенных типов

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



Офлайн

#8 Март 10, 2014 00:46:16

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Наследование встроенных типов

py.user.next

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

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



Офлайн

#9 Март 10, 2014 02:33:38

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Наследование встроенных типов

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)

Офлайн

#10 Март 10, 2014 03:13:22

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Наследование встроенных типов

py.user.next
это не конструктор
py.user.next
ты не заметил, что в предыдущем сообщении дана ссылка на место, где описывается это ?

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

py.user.next
какой это конструктор, если он не создаёт объект ?
__new__ не инициализирует атрибуты класса, __init__ не создает объект, поэтому я сказал “конструктор разделён на два метода” и привёл ссылку.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version