Найти - Пользователи
Полная версия: Наследование
Начало » Python для экспертов » Наследование
1 2
Cyxapeff
Всем здрасте.
Чего-то не могу понять такую вещь…

Есть класс:
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.
j2a
class A(object)
Cyxapeff
спасибо.
poltergeist
А так нельзя?

>>> 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
>>>
slivlen
poltergeist
А так нельзя?
Можно, но ИМХО не нужно :)
pento
slivlen
Можно, но ИМХО не нужно
А почему? Ну то почему первый метод (с помощью super()) предпочтительнее?
Андрей Светлов
Предпочтительней использовать new style classes, наследуя для этого все свои от object.
Потому что они дают много вкусных возможностей, недоступных при прежнем подходе.
А super - стандартный способ вызова родителя в new-style.
Old-style classes уйдут окончательно в Py3k, но уже сейчас стоит от них отвыкать.

О различиях, вернее, о новых фичах new-style написано в http://www.python.org/doc/newstyle. Существуют и многочисленные статьи на русском по этой теме.
pento
Андрей Светлов, большое спасибо!
poltergeist
“Python 3000 is a new version of the language that is incompatible with the 2.x line of releases.” - это меня больше всего поразило:) Это и радует и добавляет некоторые проблемки, особенно для не маленьких проектов. Молодцы конечно, что за год до релиза выдали альфу и доки:)
P.S. от меня тож спасибо, а то так заработаешься, что вокруг ничего не замечаешь что творится. Знал что вышла 3000 альфа, но не думал что столько изменений будет в синтаксисе.
bialix
pento
slivlen
Можно, но ИМХО не нужно
А почему? Ну то почему первый метод (с помощью super()) предпочтительнее?
ИМХО, super предпочтительнее потому, что так можно легко и просто менять родителей твоего класса, не заботясь о подобных мелочах, как явный вызов метода из какого-то (необязательно родительского) класса.
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