由于 Python 的作用域规则,装饰函数通常无法访问装饰器中的任何变量。但是,由于函数可以具有分配给它们的任意属性,因此您可以在装饰器中执行以下操作以获得类似的效果(由于相同的范围规则):
def funcDec(func):
localVariable = "I'm a local string"
def wrapped(*args):
print("Calling localVariable from funcDec " + localVariable)
func(*args)
print("done with calling f1")
wrapped.attrib = localVariable
return wrapped
@funcDec
def f1(x, y):
print(x + y)
print('f1.attrib: {!r}'.format(f1.attrib))
f1(2, 3)
这将产生以下输出:
Calling localVariable from funcDec I'm a local string
5
f1.attrib: "I'm a local string"
done with calling f1
有人问这是否可以应用于类的方法:答案是“是”,但是您必须通过类本身或作为self
参数传递的它的实例来引用该方法。这两种技术如下所示。使用self
是更可取的,因为它使代码独立于它所在的类的名称。
class Test(object):
@funcDec
def f1(self):
print('{}.f1() called'.format(self.__class__.__name__))
print('self.f1.attrib: {!r}'.format(self.f1.attrib)) # Preferred.
print('Test.f1.attrib: {!r}'.format(Test.f1.attrib)) # Also works.
print()
test = Test()
test.f1()
输出:
Calling localVariable from funcDec I'm a local string
Test.f1() called
self.f1.attrib: "I'm a local string"
Test.f1.attrib: "I'm a local string"
done with calling f1