我想在单例中保留对回调函数的引用。 然而,python做了一些魔术(无论是在赋值点还是在调用点),这意味着函数需要一个实例对象作为第一个参数 - 我希望能够存储一个简单的函数。我怎么能这样做?
分配给X.__dict__
具有相同的效果。
def default(): print "default"
class X:
func = None
@staticmethod
def setup(f=default):
X.func = f
@staticmethod
def doit():
if X.func is None: X.setup()
# !!!!!!!
# TypeError: unbound method g() must be called with X instance as first argument (got nothing instead)
X.func()
def g(): print "g"
X.setup(g)
X.doit()
答案 0 :(得分:1)
首先,
如果你这样做:
在X.func()
之后 X.setup()
。它不会起作用。问题在于设置功能。</ p>
第一个问题是你的f=default
。此语法在python中不起作用。您无法将变量分配给默认参数。
关于你的问题本身,你的班级X
不会与函数g(或默认值)“绑定”。
你需要
def default(): print "default"
class X:
func = None
@staticmethod
def setup(f):
if f is None:
X.func = staticmethod(default)
else:
X.func = staticmethod(f)
@staticmethod
def doit():
if X.func is None: X.setup()
X.func()
def g(): print "g"
X.setup(g)
X.doit()
编辑:请使用python 3