这取决于您的代码行的顺序。如果我们的装饰器在some方法之前调用了一个参数,那么some_global有它的初始值,否则如果你在装饰器之前调用某个方法,那么全局变量的值就会改变。
与此代码:
some_global = 15
def some_decorator(val):
print("decorator val: {}".format(val))
print("decorator global: {}".format(some_global))
def real_decorator(function):
def wrapper():
function()
return wrapper
return real_decorator
class SomeClass:
def some_method(self):
global some_global
some_global = 5
print("method: {}".format(some_global))
,如果你写
@some_decorator(some_global)
def some_function():
print("function: {}".format(some_global))
SomeClass().some_method()
some_function()
然后输出将是
decorator val: 15
decorator global: 15
method: 5
function: 5
但是这个代码的输出:
SomeClass().some_method()
@some_decorator(some_global)
def some_function():
print("function: {}".format(some_global))
some_function()
将是:
method: 5
decorator val: 5
decorator global: 5
function: 5
我强烈建议你不要使用全局变量。
在你的情况,你可以在你的装饰的包装直接使用它:
some_global = 15
def real_decorator(function):
print("decorator: {}".format(some_global))
def wrapper():
print("wrapper: {}".format(some_global))
function()
return wrapper
class SomeClass:
def some_method(self):
global some_global
some_global = 5
print("method: {}".format(some_global))
@real_decorator
def some_function():
print("function: {}".format(some_global))
SomeClass().some_method()
some_function()
在这段代码
,变量在包装价值不仅取决于功能顺序的底部调用代码并且等于其在某些功能中的值:
SomeClass().some_method()
some_function()