Python 模拟函数的静态变量
解决方案:错误在于我的函数实际上是一个方法 我正在尝试使用装饰器来模拟函数的变量。为什么在下面的最后一行出现这个错误<代码>未定义全局名称“onecmd”Python 模拟函数的静态变量,python,Python,解决方案:错误在于我的函数实际上是一个方法 我正在尝试使用装饰器来模拟函数的变量。为什么在下面的最后一行出现这个错误未定义全局名称“onecmd” def static_var(varname, initial_value): def decorate(func): setattr(func, varname, initial_value) return func return decorate @static_var("last", None) def
def static_var(varname, initial_value):
def decorate(func):
setattr(func, varname, initial_value)
return func
return decorate
@static_var("last", None)
def onecmd(self, line):
if line == "lastcmd":
line = onecmd.last
else:
onecmd.last = line
您的代码似乎希望能够以全局方式访问
onecmd
,但这是一种方法。在模块级定义的函数确实可以通过其名称访问(因为它们存储为全局函数),但类方法仅存储在类对象中
您需要通过定义函数对象的类或通过self
属性找到函数对象,然后返回到类和函数:
@static_var("last", None)
def onecmd(self, line):
onecmd = type(self).onecmd.im_func # im_func is the wrapped function
if line == "lastcmd":
line = onecmd.last
else:
onecmd.last = line
由于您已经有了类方法,因此最好将变量存储在类中:
或者甚至将其作为类方法:
class Foo(object):
last = None
@classmethod
def onecmd(cls, line):
if line == "lastcmd":
line = cls.last
else:
cls.last = line
您的代码似乎希望能够以全局方式访问
onecmd
,但这是一种方法。在模块级定义的函数确实可以通过其名称访问(因为它们存储为全局函数),但类方法仅存储在类对象中
您需要通过定义函数对象的类或通过self
属性找到函数对象,然后返回到类和函数:
@static_var("last", None)
def onecmd(self, line):
onecmd = type(self).onecmd.im_func # im_func is the wrapped function
if line == "lastcmd":
line = onecmd.last
else:
onecmd.last = line
由于您已经有了类方法,因此最好将变量存储在类中:
或者甚至将其作为类方法:
class Foo(object):
last = None
@classmethod
def onecmd(cls, line):
if line == "lastcmd":
line = cls.last
else:
cls.last = line