帮助一个人。似乎无法让装饰器与继承一起工作。将其分解为我的临时工作空间中最简单的小例子。似乎仍然无法使其发挥作用。
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实例作为第一个参数(获取函数实例)
好的,@self.decor
怎么样?名称“self”未定义。
好的,@foo.decor
怎么样?!名称“foo”未定义。
AaaaAAaAaaaarrrrgggg ......我做错了什么?
答案 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()