解
使函数的默认参数之一成为函数本身的引用.
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后设置默认值.
装饰
这是一个简单的装饰师为你做这件事.请注意,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'