【发布时间】:2018-09-17 17:08:45
【问题描述】:
有一个带有继承的装饰器。效果很好:
class bar(object):
def __init__(self,val):
self.val = val
@staticmethod
def decor(func):
def increment(obj, x):
return func(obj, x) + obj.val
return increment
class foo(bar):
def __init__(self):
bar.__init__(self)
@bar.decor
def add(self, x):
return x
但是我想在class foo中添加一个参数:
class foo(bar):
def __init__(self,B):
bar.__init__(self)
self.B = B
我想将B作为参数输入到装饰器中,我试了一下:
class bar(object):
def __init__(self,val):
self.val = val
@staticmethod
def decor(B):
def wrap(func):
def increment(obj, x):
return func(obj, x) + obj.val + B
return increment
return wrap
class foo(bar):
def __init__(self,B):
bar.__init__(self)
self.B = B
@bar.decor(B)
def add(self, x):
return x
但它没有用。我做错了什么?
【问题讨论】:
-
在
@bar.decor(B)装饰中你会从哪里得到B? -
在
class foo(bar)的__init__()方法中,self.B = B语句中赋值右侧使用的名为B的变量从何而来? -
您尝试做的事情似乎是不可能的。一旦定义了方法,装饰器就会在导入时执行。他们不会等到类的实例被实例化。因此,它们不能依赖于传递给
__init__的值。
标签: python inheritance parameters decorator