如何将decorator应用于子类中的超类方法



假设我们有以下情况,

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()
        ...
        ...

现在,在类B中,我想使用类A中的东西(),但是我想对它应用一个装饰器。我不能在A类装修,因为我要在不同的地方申请不同的装修师。例如,类C(A),我想在这里也使用一些东西(),使用不同的装饰符。

那么,回到最初的问题;我如何将装饰器应用于子类中的超类方法?

您为什么不能重写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

好了(带和不带参数):

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()

最新更新