Python 模拟函数的静态变量

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

解决方案:错误在于我的函数实际上是一个方法

我正在尝试使用装饰器来模拟函数的变量。为什么在下面的最后一行出现这个错误<代码>未定义全局名称“onecmd”

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