可以分配一个类属性,它是一个简单的函数python

时间:2018-01-25 18:44:47

标签: python

我想在单例中保留对回调函数的引用。 然而,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()

1 个答案:

答案 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