2012-04-21 1 views
0

Я понимаю, что лучший способ вызвать метод суперкласса в Python является wirte:Могу ли я вызвать метод в суперкласс в иерархии классов питон, не используя имя текущего класса

class Foo(Bar): 
    def foo(self): 
     ... 
     super(Foo, self).foo() 
     ... 

Однако это означает, что если я изменил имя класса Foo или I, вырезал и вставлял код в другой класс, я должен помнить, чтобы изменить строку, вызывающую метод в суперклассе. Есть ли способ обойти это? Как минимум это раздражает, в худшем случае очень склонна к ошибкам.

+1

** не копировать и вставлять код в другой класс –

+0

Возможный дубликат [Как вызвать метод родительского класса из дочернего класса в python?] (Http://stackoverflow.com/questions/805066/ how-to-call-a-parent-classes-method-from-child-class-in-python) –

+0

Я написал «cut & paste», а не «copy & paste», есть разница – gae123

ответ

1

В Python 3 вы можете написать super(), и он заполнит ваш класс.

В Python 2 вам нужно написать имя класса. Но изменение названий классов - это не совсем обычная операция, поэтому я не вижу в этом особых трудностей. Вам просто нужно запомнить поиск и замену имени класса, если вы его измените, - но тогда вам, вероятно, придется все это сделать, потому что его подклассы также будут ссылаться на него по имени.

0

Вы имеете в виду простой, безопасный и понятный способ для всех (насколько супер() идет)?

Короткий ответ: нет.

Длинный ответ: да. Есть несколько способов сделать это. Один из них использует метакласс для автоматизации создания super() во время инициализации класса.

>>> class AutoSuper(type): 
...  def __init__(cls, name, bases, dict): 
...   super(AutoSuper, cls).__init__(name, bases, dict) 
...   setattr(cls, '_%s__super'%name, super(cls)) 
... 
>>> 

Таким образом, вызов super() создаваемого класса присваивается атрибуту __super. Манипуляция имени должна выполняться вручную, но экземпляры и подклассы поражают ее соответствующим образом. Теперь вам даже не нужно называть супер, просто используйте атрибут __super.

>>> class A(object): 
...  __metaclass__ = AutoSuper 
...  def m(self): 
...   print 'A' 
... 
>>> 
>>> class B(A): 
...  def m(self): 
...   print 'B' 
...   self.__super.m() 
... 
>>> 
>>> class C(B): 
...  def m(self): 
...   print 'C' 
...   self.__super.m() 
... 
>>> obj = C() 
>>> obj.m() 
C 
B 
A 
>>> 

Конечно, я публикую это только для учебных целей, я не рекомендую его использовать. Это то, что граничит с excess of cleverness, что некоторые осуждают на Python.

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