假设我想扩展以下Python类,其中包括一个我不太了解的装饰器:

from somewhere import some_decorator

class One(object):
    @some_decorator
    def some_method(self):
        do_something()

我应该装饰覆盖的方法吗?换句话说,我可以安全地执行以下操作:
class Two(One):
    def some_method(self):
        super(Two, self).some_method()

还是我需要做:
class Two(One):
    @some_decorator
    def some_method(self):
        super(Two, self).some_method()

最佳答案

记住@decorator语法的作用:

@decorator
def foo():
    print "foo"

只是语法糖
def foo():
    print "foo"
foo = decorator(foo)

因此,未经修饰的函数在修饰后就无法再按其名称调用,因为其名称已分配给其他名称。

这意味着,当您在子类中调用super(Two, self).some_method()时,将调用父类中经过修饰的函数some_method

知道是否还需要装饰子重写的方法完全取决于您要执行的操作以及装饰程序的工作。但是要知道,如果您调用super(Two, self).some_method(),那么您将调用修饰的函数。

10-04 16:09
查看更多