Форум сайта python.su
0
py.user.nextТ.е при вызвове Mylist(list) вызывается Mylist.__new__(Mylist), но так как в классе Mylist не определен __new__ оно транслируется в выражение list.__new__(list), которое и возвращает объект списка.
когда наследуешь от списка, то получаешь класс, экземпляры которого очень похожи на списки, прямо один в один
Отредактировано Maksim (Март 10, 2014 08:27:36)
Офлайн
857
Budulianinпиши конкретно, где называют
Просто замечание написал, что почти везде __init__ называют конструктором.
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'> >>>
Отредактировано py.user.next (Март 10, 2014 09:37:42)
Офлайн
253
MaksimС чего это вы так решили? Нельзя их заменить - разные объекты получаются. Ну посмотрите наконец сами:
x = Mylist(), можно заменить просто выражением x = list().
x = Mylist() type(x) x = list() type(x)
MaksimЧто вы имеете в виду? Собственно почему вы после того как вам 3 человека много раз повторили что вы получили экземпляр тип которого не список, продолжаете считать его списком?
Mylist который является списком
MaksimКод свой приведите. Покажите что он чтото получил.
Где получает значение экземпляр класса Mylist
Офлайн
0
doza_andЧто тип экземпляра не список я и сам вижу. Но объяснения я неполучил почему так.
Что вы имеете в виду? Собственно почему вы после того как вам 3 человека много раз повторили что вы получили экземпляр тип которого не список, продолжаете считать его списком?
class Mylist(list):pass
Отредактировано Maksim (Март 10, 2014 08:56:07)
Офлайн
857
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)
Офлайн
0
py.user.next
Понятно, тогда выражение Mylist(list) транслируется в Mylist.__new__(Mylist), которое возвращает экземпляр класса Mylist, но почему оно в итоге является списком?
py.user.nextСогласитесь экземпляр встроенного типа и экземпляр пользовательского класса это не совсем одно и тоже. Экземпляр пользовательского класса сохраняет информацию о состоянии в атрибутах(доступ к данным осуществляется через атрибуты), позволяет создавать и изменять имена внутри объета, а встроенный тип - нет
какой-то набор слов
Офлайн
857
Maksimне, видимо, в list.__new__(Mylist)
Понятно, тогда выражение Mylist(list) транслируется в Mylist.__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)
Офлайн
0
py.user.nextНо ведь в первом аргументе передан класс Mylist, экземпляр которого должен быть создан?
видимо, в list.__new__(Mylist)
Офлайн
857
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.
Офлайн
0
и откуда тогда все-таки в объекте берется список?
Офлайн