【问题标题】:How can I apply decorator to a superclass method in a subclass?如何将装饰器应用于子类中的超类方法?
【发布时间】:2016-12-31 03:59:38
【问题描述】:

说,我们有以下情况,

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 类中的 something(),但我想对其应用装饰器。 我不能在 A 类中装饰它,因为我想在不同的地方应用不同的装饰器。比如说,C(A) 类,我也想在这里使用 something(),使用不同的装饰器。

所以,回到原来的问题;如何将装饰器应用于子类中的超类方法?

【问题讨论】:

  • 为什么你需要“应用一个装饰器”而不是仅仅用子类特定的代码来包装A.method() 调用,不管装饰器会做什么?请举例说明您希望做什么。
  • @BrenBarn 你能否对“包装方法”有所了解,或者请指导我,因为我是这些概念的新手。
  • 不,我不能,直到你展示一个你想要这个假设代码做什么的例子。它可以是“假”代码(即,实际上不起作用的代码)。但是您需要展示一个具体示例来说明您希望实现的目标。
  • @BrenBarn 我已经更新了 OP。请检查。
  • newSomething = decorator(self.something) 然后是newSomething()——但你可以(也应该)将装饰器中的逻辑直接放入子类中。

标签: python inheritance python-decorators


【解决方案1】:

有什么特殊原因不能覆盖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

【讨论】:

  • 嘿伙计们,这不公平 :) 问题是关于装饰器的,而不是使用 super 方法。
  • @turkus 老实说,这更像是XY problem。仅仅因为他认为他需要一个装饰器并不意味着装饰器是正确的解决方案:)
  • 是的,我知道 :) 但也许他只是想锻炼一下。我不知道。只有他知道:)
  • @turkus 不过,用溜冰鞋和冰球练习踢足球并不是一个好主意。
  • 我同意,这个解决方案更好,好吧,我只能说:想象一下,如果你去商店想买一个蛋糕,有人会给你一个面包。你可以接受或不接受,因为这不是你要问的。
【解决方案2】:

给你(带参数和不带参数):

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

【讨论】:

  • 如果simple_dec()有一些参数怎么办?
  • 为什么我被否决了。请解释。问题是关于没有使用超级方法的装饰器。
  • @turkus 在我发布我的答案之前,反对票就在那里,所以可能是出于其他原因。好像我也投了反对票:P
猜你喜欢
  • 2014-03-20
  • 2016-07-24
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
  • 2020-05-06
  • 2019-11-27
  • 2021-04-20
  • 1970-01-01
相关资源
最近更新 更多