2016-08-24 6 views
-1

Скажем, мы имеем следующую ситуацию,Как применить декоратор к методу суперкласса в подклассе?

class A(): 
    def something(): 
     ... 
     ... 
     ... 


class B(A): 
    def use_something(): 
     ... 
     ... 
     # Now, at this point I want something() to be decorated with a 
     # decorator. But, since it is already defined in base class, 
     # I am not getting how to decorate it here, in the subclass. 
     self.something() 
     ... 
     ... 

Теперь, в классе В, я хочу использовать что-то() из класса А, но я хочу, чтобы применить декоратор к нему. Я не могу украсить его в классе A, так как есть разные декораторы, которые я хочу применять в разных местах. Скажем, класс C (A), и я хочу использовать что-то() здесь, а также с другим декоратором.

Итак, вернемся к исходному вопросу; как я могу применить декоратор к методу суперкласса в подклассе?

+3

Зачем вам нужно «нанести декоратор» вместо того, чтобы просто обернуть вызов 'A.method()' с кодом подкласса, который делает то, что сделает декоратор? Пожалуйста, покажите пример того, что вы надеетесь сделать. – BrenBarn

+0

@BrenBarn Можете ли вы, пожалуйста, пролить свет на «обертывание метода» или, пожалуйста, направить меня к нему, так как я новичок в этих понятиях. –

+1

Нет, я не могу, пока вы не покажете пример того, что вы хотите, чтобы этот гипотетический код делал. Это нормально, потому что это «поддельный» код (т. Е. Код, который на самом деле не работает). Но вам нужно показать конкретный пример того, чего вы надеетесь достичь. – BrenBarn

ответ

0

Любая конкретная причина, почему вы не можете просто переопределить something()?

class A(): 
    def something(self): 
     ... 

class B(A): 
    def use_something(self): 
     ... 
     self.something() 
     ... 

    def something(self): 
     # Do "decorator" stuff 
     super().something() 
     # Do more "decorator" stuff 
+0

Эй, ребята, это несправедливо :) Вопрос был о декораторах, а не о методе '' super''. – turkus

+0

@turkus Это было больше [проблема XY] (http://mywiki.wooledge.org/XyProblem), если честно. Просто потому, что он считает, что ему нужен декоратор, это не значит, что декоратор - это правильное решение :) –

+0

Да, я знаю :) Но, возможно, он хотел просто тренироваться. Я не знаю. Только он знает :) – turkus

0

Здесь вы идете (с Params и без него):

def simple_dec(func): 
    def wrapped(*args, **kwargs): 
     return 'No way' 
    return wrapped 


def simple_dec_params(first_param, second_param): 
    def dec(func): 
     def wrapped(*args, **kwargs): 
      return '{} {}'.format(first_param, second_param) 
     return wrapped 
    return dec 


class A(): 
    def something(self): 
     print 'Something' 


class B(A): 
    def use_something(self): 
     first_param = 'No' 
     second_param = 'Way' 
     print simple_dec(self.something)() 
     print simple_dec_params(first_param, second_param)(self.something)() 


b = B() 
b.use_something() 
+0

Что делать, если simple_dec() имеет некоторые параметры? –

+0

@Ali_Waris отредактирован. – turkus

+0

Почему я получил downvote. Пожалуйста, объясни. Вопрос заключался в том, что декораторы не используют супер метод. – turkus