Уведомления

Группа в Telegram: @pythonsu

#1 Март 10, 2014 08:25:07

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

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

py.user.next
когда наследуешь от списка, то получаешь класс, экземпляры которого очень похожи на списки, прямо один в один
Т.е при вызвове Mylist(list) вызывается Mylist.__new__(Mylist), но так как в классе Mylist не определен __new__ оно транслируется в выражение list.__new__(list), которое и возвращает объект списка.
Т.е получается выражение x = Mylist(), можно заменить просто выраженим x = list(). Но почему в итоге получаем экземпляр класса Mylist который является списком. Да и вообще, экземпляр пользовательского класса это пространство имен значения которых хранятся в атрибутах. Где получает значение экземпляр класса Mylist при наследовании от встроенных типов тоже не понятно.

Отредактировано Maksim (Март 10, 2014 08:27:36)

Офлайн

#2 Март 10, 2014 08:44:49

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

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

Budulianin
Просто замечание написал, что почти везде __init__ называют конструктором.
пиши конкретно, где называют
даже Пилгрим (автор dip) сначала писал, что это почти конструктор, а потом перестал это писать

Budulianin
__new__ не инициализирует атрибуты класса
>>> class A:
...     
...     i = 0
...     
...     class X:
...         pass
...     
...     def __new__(cls, *args):
...         cls.i = 1
...         x = cls.X()
...         x.i = (1,) + args
...         return x
... 
>>> A.i
0
>>> 
>>> a = A('abc', 'def')
>>> a.i
(1, 'abc', 'def')
>>> A.i
1
>>> 
>>> type(a)
<class '__main__.A.X'>
>>> type(A)
<class 'type'>
>>>

всё проинициализировано без __init__'ов



Отредактировано py.user.next (Март 10, 2014 09:37:42)

Офлайн

#3 Март 10, 2014 08:46:15

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

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

Maksim
x = Mylist(), можно заменить просто выражением x = list().
С чего это вы так решили? Нельзя их заменить - разные объекты получаются. Ну посмотрите наконец сами:
x = Mylist()
type(x)
x = list()
type(x)
Maksim
Mylist который является списком
Что вы имеете в виду? Собственно почему вы после того как вам 3 человека много раз повторили что вы получили экземпляр тип которого не список, продолжаете считать его списком?
Maksim
Где получает значение экземпляр класса Mylist
Код свой приведите. Покажите что он чтото получил.



Офлайн

#4 Март 10, 2014 08:55:34

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

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

doza_and
Что вы имеете в виду? Собственно почему вы после того как вам 3 человека много раз повторили что вы получили экземпляр тип которого не список, продолжаете считать его списком?
Что тип экземпляра не список я и сам вижу. Но объяснения я неполучил почему так.
class Mylist(list):pass
при вызове Mylist(list) транслируется Mylist.__new__(Mylist) транслируется list.__new__(list) возвращается список.

Отредактировано Maksim (Март 10, 2014 08:56:07)

Офлайн

#5 Март 10, 2014 09:32:55

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

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

Maksim
Т.е при вызвове Mylist(list) вызывается Mylist.__new__(Mylist), но так как в классе Mylist не определен __new__ оно транслируется в выражение list.__new__(list)
>>> class B:
...     def __new__(cls):
...         print('in B', cls)
... 
>>> class A(B):
...     #def __new__(cls):
...     #    print('in A', cls)
...     pass
... 
>>> a = A()
in B <class '__main__.A'>
>>> 
>>> 
>>> class B:
...     def __new__(cls):
...         print('in B', cls)
... 
>>> class A(B):
...     def __new__(cls):
...         print('in A', cls)
...     pass
... 
>>> a = A()
in A <class '__main__.A'>
>>>

Maksim
Да и вообще, экземпляр пользовательского класса это пространство имен значения которых хранятся в атрибутах.
какой-то набор слов

Maksim
Где получает значение экземпляр класса Mylist при наследовании от встроенных типов
какое значение ?



Отредактировано py.user.next (Март 10, 2014 09:43:04)

Офлайн

#6 Март 10, 2014 18:33:47

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

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

py.user.next
Понятно, тогда выражение Mylist(list) транслируется в Mylist.__new__(Mylist), которое возвращает экземпляр класса Mylist, но почему оно в итоге является списком?

py.user.next
какой-то набор слов
Согласитесь экземпляр встроенного типа и экземпляр пользовательского класса это не совсем одно и тоже. Экземпляр пользовательского класса сохраняет информацию о состоянии в атрибутах(доступ к данным осуществляется через атрибуты), позволяет создавать и изменять имена внутри объета, а встроенный тип - нет

Офлайн

#7 Март 10, 2014 23:58:57

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

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

Maksim
Понятно, тогда выражение Mylist(list) транслируется в Mylist.__new__(Mylist)
не, видимо, в list.__new__(Mylist)

Maksim
Согласитесь экземпляр встроенного типа и экземпляр пользовательского класса это не совсем одно и тоже.
встроенные классы (типы) закрыты для изменений
скорее всего, это связано с тем, что они уже скомпилированы

Maksim
Экземпляр пользовательского класса сохраняет информацию о состоянии в атрибутах(доступ к данным осуществляется через атрибуты)
у встроенных тоже есть атрибуты

>>> hasattr(list, 'append')
True
>>>

>>> (0.5).real
0.5
>>>

Maksim
экземпляр пользовательского класса это пространство имен значения которых хранятся в атрибутах
>>> class A:
...   pass
... 
>>> a = A()
>>> dir(a)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
>>>

это не просто пространство имён
в экземпляре пустого класса есть множество атрибутов



Отредактировано py.user.next (Март 11, 2014 00:00:15)

Офлайн

#8 Март 11, 2014 07:37:36

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

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

py.user.next
видимо, в list.__new__(Mylist)
Но ведь в первом аргументе передан класс Mylist, экземпляр которого должен быть создан?

Офлайн

#9 Март 12, 2014 01:18:08

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

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

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

ссылка на документацию описывает такое поведение
Typical implementations create a new instance of the class by invoking the superclass’s __new__() method using super(currentclass, cls).__new__(cls) with appropriate arguments and then modifying the newly-created instance as necessary before returning it.



Офлайн

#10 Март 12, 2014 10:57:25

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

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

и откуда тогда все-таки в объекте берется список?

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version