Python装饰器和继承

whe*_*ies 17 python inheritance decorator

帮助一个人.似乎无法让装饰器与继承一起工作.将其分解为我的临时工作空间中最简单的小例子.仍然似乎无法让它工作.

class bar(object):
    def __init__(self):
        self.val = 4
    def setVal(self,x):
        self.val = x
    def decor(self, func):
        def increment(self, x):
            return func( self, x ) + self.val
        return increment

class foo(bar):
    def __init__(self):
        bar.__init__(self)
    @decor
    def add(self, x):
        return x
Run Code Online (Sandbox Code Playgroud)

哎呀,名字"装饰"没有定义.

好的,怎么样@bar.decor?TypeError:必须使用bar实例作为第一个参数调用未绑定方法"decor"(获取函数实例)

好的,怎么样@self.decor?名称"self"未定义.

好的,怎么样@foo.decor?!名称"foo"未定义.

AaaaAAaAaaaarrrrgggg ...我做错了什么?

Pär*_*der 20

定义decor为静态方法并使用以下形式@bar.decor:

class bar(object):
    def __init__(self):
        self.val = 4
    def setVal(self,x):
        self.val = x
    @staticmethod
    def decor(func):
        def increment(self, x):
            return func(self, x) + self.val
        return increment

class foo(bar):
    def __init__(self):
        bar.__init__(self)
    @bar.decor
    def add(self, x):
        return x
Run Code Online (Sandbox Code Playgroud)

  • 这目前有效吗?它不会引发 `TypeError: staticmethod is not callable` 吗? (2认同)