防止类的函数属性作为第一个arg传递给self

时间:2011-08-15 03:16:13

标签: python oop syntax

好的,所以我有一个类,其中一个属性是回调函数。问题是,无论何时我在课堂上调用它(例如self.function_attr(),它都会作为第一个参数传递self。这里是我正在使用的想法:

def callback(a, b):
    # do something with a, b

class A:
    def __init__(self, callback):
        self.callback = callback
        self.callback(1, 2) # Raises a TypeError: takes exactly 2 arguments (3 given)

我不愿意编写每个回调函数来将self作为第一个参数。我写了一个解决问题的装饰器:

def callback_decorator(func):
    def newfunc(self, *args, **kw):
        return func(*args, **kw)
    return newfunc

但我想知道是否还有更好的东西。

基本上,我的问题是,如何调用我的类的实例属性,这些属性是没有将它们作为第一个参数传递给self的函数?

2 个答案:

答案 0 :(得分:2)

当你将它绑定到类时,你只需要将它作为静态方法。

def callback(a, b):
    # do something with a, b

class A:
    def __init__(self, callback):
        # now it won't get passed self
        self.callback = staticmethod(callback)
        self.callback(1, 2)

class A:
    def __init__(self, callback):
        self.callback(1, 2)

    # now it won't get passed self
    callback = staticmethod(callback)

答案 1 :(得分:0)

据我所知,包装器(如装饰器)是最简单的方法。既然你已经有了一个存储函数的对象,我就不会打扰装饰器了。 (注意我继承自object,除非你特别想要旧式的类行为,否则你应该做的事情。)

class A(object):

    def __init__(self, callback):
        self._callback = callback
        self.callback(1,2)


    def callback(self, *args, **kwargs):
        return self._callback(*args, **kwargs)

这表现得如你所愿:

>>> def f(x, y):
...     print "X: %s, Y: %s" % (x,y)
... 
>>> mya = A(f)
X: 1, Y: 2