好的,所以我有一个类,其中一个属性是回调函数。问题是,无论何时我在课堂上调用它(例如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
的函数?
答案 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