Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Множественное наследование, в Python 
V
    Опции темы
Artemios
Дата 20.10.2006, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



Код

>>> class A:
...         def __init__(self):
...             self.a = 1
...
>>> class B:
...         def __init__(self):
...             self.b = 5
...
>>> class C(A,B):
...         pass
...
>>> c = C()
>>> c.__dict__
{'a': 1}

>>> class D(A,B):
...         def __init__(self):
...             pass
...
>>> d = D()
>>> d.__dict__
{}

>>> class E(A,B):
...     def __init__(self):
...         A.__init__(self)
...         B.__init__(self)
...
>>> e = E()
>>> e.__dict__
{'a': 1, 'b': 5}
>>>


Непонятна ситуация с классом C.


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
slivlen
Дата 20.10.2006, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 8.8.2006

Репутация: 1
Всего: 3



Код

>>> class C(A,B):
...         def __init__(self):
...             pass
...
>>> c = C()
>>> c.__dict__
{}

А так все нормально smile
PM MAIL   Вверх
cherep
Дата 20.10.2006, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 11.1.2006
Где: Москва

Репутация: 1
Всего: 4



А что конкретно не ясно-то? Вроде все логично.. Если ты не переопределил конструктор (как в классе C), то при создании экземпляра этого класса будет вызван конструктор первого суперкласса, т.е. A. На то оно и наследование...
PM MAIL WWW ICQ   Вверх
slivlen
Дата 20.10.2006, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 8.8.2006

Репутация: 1
Всего: 3



Цитата(cherep @  20.10.2006,  18:48 Найти цитируемый пост)
А что конкретно не ясно-то? Вроде все логично.. Если ты не переопределил конструктор (как в классе C), то при создании экземпляра этого класса будет вызван конструктор первого суперкласса, т.е. A. На то оно и наследование... 

Точняк smile

PM MAIL   Вверх
Daevaorn
Дата 20.10.2006, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 9
Всего: 70



Цитата(cherep @  20.10.2006,  19:48 Найти цитируемый пост)
Вроде все логично

Логично вызвать конструкторы всех подобъектов, а не только первого, разве нет? А то получается: мама родилась, а папа нет.
PM MAIL WWW   Вверх
J2A
Дата 21.10.2006, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 17.11.2005
Где: Омск

Репутация: 16
Всего: 18



Daevaorn, считаешь что так более правильно - убеди товарищей из python-dev. Только предварительно не забудь написать патч, который меняет поведение Python на нужное тебе.
--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
setq
Дата 21.10.2006, 12:14 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











cherep, не то чтобы очень логично. С точки зрения того, что у класса может быть только один метод __init__ и поэтому по правилам поиска выбирается __init__ первого базового класса -- да. С точки зрения того "как должно быть правильно" -- наверно всё-таки нет.
  Вверх
Artemios
Дата 21.10.2006, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



Цитата(setq @  21.10.2006,  12:14 Найти цитируемый пост)
у класса может быть только один метод __init__ и поэтому по правилам поиска выбирается __init__ первого базового класса

Понятно, спасибо.

Цитата(setq @  21.10.2006,  12:14 Найти цитируемый пост)
С точки зрения того "как должно быть правильно" -- наверно всё-таки нет. 

на этом меня и "глюкнуло" smile



--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
cherep
Дата 21.10.2006, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 11.1.2006
Где: Москва

Репутация: 1
Всего: 4



Цитата

Логично вызвать конструкторы всех подобъектов, а не только первого, разве нет? А то получается: мама родилась, а папа нет. 


Как раз это менее логично, хотябы по тому, что explicit is better than implicit. Порядок перечисления суперклассов при определении нового класса , ну то есть 
Код

class A(B, C, D, E):
    pass


определяет прежде всего порядок перекрытия одноименных методов и полей в т.ч. и конструктора.

Или Вы считаете что вызов A().meth(arg) должен приводить к B.meth(self, arg), C.meth(self, arg) и т.д. - это глупо, т.к. такое поведение редко надо, а если надо, то достигается явным (explicit) определением:
Код

class A(B, C, D, E):
    def meth(self, arg):
        B.meth(self, arg)
        C.meth(self, arg)


Ровно таким же образом можно задать и вызов всех конструкторов, если нужно.
PM MAIL WWW ICQ   Вверх
Daevaorn
Дата 21.10.2006, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 9
Всего: 70



Цитата(cherep @  21.10.2006,  14:57 Найти цитируемый пост)
Как раз это менее логично, хотябы по тому, 

Ну я, по крайней мере, знаю один язык программирования с множественным наслодованием, где именно такое поведениеsmile

У каждого языка свои особенности. Поэтому запомним, что python ведет себя так, а не иначе.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1361 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.