2014-10-02 4 views
1

Рассмотрим следующие классы, бег python2.7:Python: вызов переопределенная метод базового класса в базовом классе инициализации

class S(object): 
    def __init__(self): 
    print 'Si' 
    self.reset() 

    def reset(self): 
    print 'Sr' 
    self.a=0 

class U1(S): 
    def reset(self): 
    print 'U1r' 
    self.b=0 
    super(S,self).reset() 

Желаемая функциональность, что

  1. создания экземпляра вызовов базового класса его метод сброса;
  2. создание экземпляра производного класса вызывает его метод сброса, а также вызывает метод сброса базового класса.

я (1):

>>> print S().a 
Si 
Sr 
0 

но не (2):

>>> print U1().b 
Si 
U1r 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "tt.py", line 4, in __init__ 
    self.reset() 
    File "tt.py", line 14, in reset 
    super(S,self).reset() 
AttributeError: 'super' object has no attribute 'reset' 

Что чистый способ получить то, что я хочу? Я предполагаю, что ошибка имеет какое-то отношение к порядку, в котором создается членство классов, но я не могу понять это из документации. , ,

ответ

2

Вы должны позвонить по номеру super(U1, self).reset() в U1.reset(). Когда вы используете super, вы всегда должны передавать имя текущего класса как первый аргумент, а не имя родительского класса. As stated in the docs:

super(type[, object-or-type])

Возвращение прокси-объект, который метод делегатов призывает родителей или родственного класса type

super будет искать способ на родителя, брата или сестры из type вы предоставляете. Когда вы предоставляете родительский класс, он попытается найти реализации reset для родителей/братьев и сестер родителя, что не удастся.

+0

D'ой спасибо Я как-то смотрел на слишком много примеров и понял, что цель дополнительного аргумента заключалась в том, чтобы отличить, какого суперкласса я хотел, если их было несколько. И действительно, поскольку ответы на дубликат, указанные выше, может сделать это, посмотрев на __mro__ и назвав класс до того, который вы хотите (поэтому «родитель» не совсем прав ...) – HST

1

Должно быть:..

super(U1, self).reset()

В моей голове, я прочитал "супер (U1, ...", как "родитель U1", чтобы держать его прямо

+0

За исключением простого случая, «родитель» вводит в заблуждение, так как ответы на дублирующий указатель https://stackoverflow.com/questions/24000419/i-cant-get-super-to-work-in-python-2- 7 объясните, или посмотрите мой комментарий выше – HST

+0

Ах, спасибо, я бы никогда не знал этого. –

Смежные вопросы