2017-02-02 4 views
-1

У меня есть куча class объектов, которые все наследуют от базового класса. Некоторые из них переопределяют метод (save) и делают вещи. Для этого конкретного случая использования я хочу временно не разрешить использовать метод save ребенка (если он существует), а скорее принудить использование родительского метода save.Вызов родительского метода извне дочернего объекта

class BaseClass(object): 
    def save(self, *args, **kwargs): 
     print("Base Called") 

class Foo(BaseClass): 
    def save(self, *args, **kwargs): 
     # do_stuff 
     print("Foo called") 
     return super(Foo, self).save(*args, **kwargs) 

obj = Foo() 

Как я могу позвонить obj родителей сохранить извне ребенка таким образом, что он печатает «Base Called»?

+0

Что вы имеете в виду? Вы имеете в виду * только * print "Base Called"? –

+0

В принципе игнорировать метод сохранения детей полностью и выполнять только родительский метод – rh0dium

+0

Вы всегда можете использовать 'BaseClass.save (obj)'. Или используйте 'super', если вы хотите, чтобы он был более общим. Хотя, это ** кричит ** «Я не должен использовать наследование» –

ответ

3

Вы можете вызывать методы из родительских объектов с super()

super(type(obj), obj).save() 

Когда я запускаю это:

class BaseClass(object): 
    def save(self, *args, **kwargs): 
     print("Base Called") 

class Foo(BaseClass): 
    def save(self, *args, **kwargs): 
     # do_stuff 
     print("Foo called") 
     return super(Foo, self).save(*args, **kwargs) 

obj = Foo() 
super(type(obj), obj).save() 

Выход:

Base Called 
+0

. Немой вопрос работает, даже если он был инициализирован? – rh0dium

+0

Я так думаю, отредактировал ответ с кодом, который я проверил. –

+0

Отличное спасибо! – rh0dium

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