Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 8, 2007 13:18:16

Cyxapeff
От:
Зарегистрирован: 2006-08-17
Сообщения: 148
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование

Всем здрасте.
Чего-то не могу понять такую вещь…

Есть класс:

class A:
def __init__(self):
...
def start(self):
...
Есть потомок. В нём я переопределяю пару функций и хочу переопределить функцию start так, чтобы вначале я определяю переменную, а потом выполняю всё что было в родительском классе. Как это сделать?

P.S Если я правильно понял, то для этого служит функция super.

Но на код
class B(A):
def __init__(self):
A.__init__(self)
def start(self):
check = True
super(B, self).start()
Она ругается TypeError'ом. super() argument 1 must be type, not class.



Офлайн

#2 Сен. 8, 2007 13:25:59

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

Наследование

class A(object)



Офлайн

#3 Сен. 8, 2007 13:30:48

Cyxapeff
От:
Зарегистрирован: 2006-08-17
Сообщения: 148
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование

спасибо.



Офлайн

#4 Сен. 8, 2007 23:26:37

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование

А так нельзя?

>>> class A:
def __init__(self):
print ‘A - init’
def start(self):
print ‘A - start’

>>> class B(A):
def __init__(self):
A.__init__(self)
def start(self):
print ‘B - start’
A.start(self)

>>> cl = B()
A - init
>>> cl.start()
B - start
A - start
>>>



Офлайн

#5 Сен. 9, 2007 01:27:15

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование

poltergeist
А так нельзя?
Можно, но ИМХО не нужно :)



Офлайн

#6 Сен. 12, 2007 17:16:46

pento
От:
Зарегистрирован: 2007-05-29
Сообщения: 100
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование

slivlen
Можно, но ИМХО не нужно
А почему? Ну то почему первый метод (с помощью super()) предпочтительнее?



Офлайн

#7 Сен. 12, 2007 17:36:56

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Наследование

Предпочтительней использовать new style classes, наследуя для этого все свои от object.
Потому что они дают много вкусных возможностей, недоступных при прежнем подходе.
А super - стандартный способ вызова родителя в new-style.
Old-style classes уйдут окончательно в Py3k, но уже сейчас стоит от них отвыкать.

О различиях, вернее, о новых фичах new-style написано в http://www.python.org/doc/newstyle. Существуют и многочисленные статьи на русском по этой теме.



Офлайн

#8 Сен. 12, 2007 18:26:43

pento
От:
Зарегистрирован: 2007-05-29
Сообщения: 100
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование

Андрей Светлов, большое спасибо!



Офлайн

#9 Сен. 12, 2007 21:28:55

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование

“Python 3000 is a new version of the language that is incompatible with the 2.x line of releases.” - это меня больше всего поразило:) Это и радует и добавляет некоторые проблемки, особенно для не маленьких проектов. Молодцы конечно, что за год до релиза выдали альфу и доки:)
P.S. от меня тож спасибо, а то так заработаешься, что вокруг ничего не замечаешь что творится. Знал что вышла 3000 альфа, но не думал что столько изменений будет в синтаксисе.



Офлайн

#10 Сен. 13, 2007 11:14:47

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

Наследование

pento
slivlen
Можно, но ИМХО не нужно
А почему? Ну то почему первый метод (с помощью super()) предпочтительнее?
ИМХО, super предпочтительнее потому, что так можно легко и просто менять родителей твоего класса, не заботясь о подобных мелочах, как явный вызов метода из какого-то (необязательно родительского) класса.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version