Найти - Пользователи
Полная версия: Наследование встроенных типов
Начало » Python для новичков » Наследование встроенных типов
1 2 3
Maksim
py.user.next
когда наследуешь от списка, то получаешь класс, экземпляры которого очень похожи на списки, прямо один в один
Т.е при вызвове Mylist(list) вызывается Mylist.__new__(Mylist), но так как в классе Mylist не определен __new__ оно транслируется в выражение list.__new__(list), которое и возвращает объект списка.
Т.е получается выражение x = Mylist(), можно заменить просто выраженим x = list(). Но почему в итоге получаем экземпляр класса Mylist который является списком. Да и вообще, экземпляр пользовательского класса это пространство имен значения которых хранятся в атрибутах. Где получает значение экземпляр класса Mylist при наследовании от встроенных типов тоже не понятно.
py.user.next
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__'ов
doza_and
Maksim
x = Mylist(), можно заменить просто выражением x = list().
С чего это вы так решили? Нельзя их заменить - разные объекты получаются. Ну посмотрите наконец сами:
x = Mylist()
type(x)
x = list()
type(x)
Maksim
Mylist который является списком
Что вы имеете в виду? Собственно почему вы после того как вам 3 человека много раз повторили что вы получили экземпляр тип которого не список, продолжаете считать его списком?
Maksim
Где получает значение экземпляр класса Mylist
Код свой приведите. Покажите что он чтото получил.
Maksim
doza_and
Что вы имеете в виду? Собственно почему вы после того как вам 3 человека много раз повторили что вы получили экземпляр тип которого не список, продолжаете считать его списком?
Что тип экземпляра не список я и сам вижу. Но объяснения я неполучил почему так.
class Mylist(list):pass
при вызове Mylist(list) транслируется Mylist.__new__(Mylist) транслируется list.__new__(list) возвращается список.
py.user.next
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 при наследовании от встроенных типов
какое значение ?
Maksim
py.user.next
Понятно, тогда выражение Mylist(list) транслируется в Mylist.__new__(Mylist), которое возвращает экземпляр класса Mylist, но почему оно в итоге является списком?
py.user.next
какой-то набор слов
Согласитесь экземпляр встроенного типа и экземпляр пользовательского класса это не совсем одно и тоже. Экземпляр пользовательского класса сохраняет информацию о состоянии в атрибутах(доступ к данным осуществляется через атрибуты), позволяет создавать и изменять имена внутри объета, а встроенный тип - нет
py.user.next
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__']
>>>

это не просто пространство имён
в экземпляре пустого класса есть множество атрибутов
Maksim
py.user.next
видимо, в list.__new__(Mylist)
Но ведь в первом аргументе передан класс Mylist, экземпляр которого должен быть создан?
py.user.next
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.
Maksim
и откуда тогда все-таки в объекте берется список?
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