解
使其中一个函数的默认参数是对函数本身的引用。
def f(self):
return self.x
f.func_defaults = (f,)
用法示例:
>>> f.x = 17
>>> b = f
>>> del f
>>> b()
17
说明
原始海报想要一个不需要全局名称查找的解决方案。简单的解决方案
def f():
return f.x
在每个调用上执行全局变量f的查找,其不满足要求。如果f被删除,则函数失败。更复杂的检查建议以同样的方式失败。
我们想要的是在对象本身内执行早期绑定和存储绑定引用。以下是概念上我们正在做的:
def f(self=f):
return self.x
在上面的例子中,self是一个局部变量,因此不执行全局查找。但是,我们不能按原样编写代码,因为当我们尝试将self的默认值绑定到f时,f尚未定义。相反,我们在定义f之后设置默认值。
装饰
这里有一个简单的装饰师为你做这个。注意,自变量必须最后,不同于方法,其中self是第一。这也意味着,如果任何其他参数采用默认值,则必须给出默认值。
def self_reference(f):
f.func_defaults = f.func_defaults[:-1] + (f,)
return f
@self_reference
def foo(verb, adverb='swiftly', self=None):
return '%s %s %s' % (self.subject, verb, adverb)
例:
>>> foo.subject = 'Fred'
>>> bar = foo
>>> del foo
>>> bar('runs')
'Fred runs swiftly'