Python装饰器和继承

时间:2010-06-08 20:42:40

标签: 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

糟糕,名称“装饰”未定义。

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

调用未绑定方法“decor”

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

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

AaaaAAaAaaaarrrrgggg ......我做错了什么?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我知道这个问题在 11 年前就有人问过了......

我遇到了同样的问题,这是我使用继承的私有装饰器的解决方案:

[part~="header-cell"] {
  background-color: var(--lumo-primary-color);
  color: var(--lumo-primary-contrast-color);
}

输出是:

class foo:
    def __bar(func):
        def wrapper(self):
            print('beginning')
            func(self)
            print('end')
        return wrapper

class baz(foo):
    def __init__(self):
        self.quux = 'middle'
    @foo._foo__bar
    def qux(self):
        print(self.quux)

a = baz()
a.qux()