Python 防止类';将函数属性作为第一个参数传递给self
好的,我有一个类,其中一个属性是回调函数。问题是,无论何时我从类内调用它(例如,作为Python 防止类';将函数属性作为第一个参数传递给self,python,oop,syntax,Python,Oop,Syntax,好的,我有一个类,其中一个属性是回调函数。问题是,无论何时我从类内调用它(例如,作为self.function\u attr()),它都会作为第一个参数传递给self。下面是我的工作思路: def callback(a, b): # do something with a, b class A: def __init__(self, callback): self.callback = callback self.callback(1, 2) #
self.function\u 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
。据我所知,包装器(比如你的装饰器)是最简单的方法。既然你已经有了一个存储函数的对象,我就不需要装饰器了。(注意,我继承了对象
,这可能是您应该做的事情,除非您特别想要旧式的类行为。)
这与您期望的一样:
>>> def f(x, y):
... print "X: %s, Y: %s" % (x,y)
...
>>> mya = A(f)
X: 1, Y: 2
当您将它绑定到类时,只需将其设置为staticmethod
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)
或
是的,我的实际类是新样式的,我的示例可能不在一些较旧的Python版本上:)这比我一直在做的要好。肯定会减少代码重复。
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)