当我尝试将一个类方法绑定到一个函数时,会出现错误。为什么?
def foo():
print "Hello world"
class something(object):
bar = foo
test = something()
test.bar()
TypeError: foo() takes no arguments (1 given)
如果我无法修改foo
,那么我能否在类定义内进行适配?
staticmethod
包装是一种简单的方法:class A():
bar = staticmethod(foo)
>>> test = A()
>>> test.bar()
Hello world
在Python中,类方法总是需要至少一个参数,通常称为self
。以下示例摘自官方Python教程:
# Function defined outside the class
def f1(self, x, y):
return min(x, x+y)
class C:
f = f1
def g(self):
return 'hello world'
h = g
self
作为参数传递。
编辑:如果您真的不能更改foo
函数,那么可以像这样做:>>> def foo():
... print "Hello World"
...
>>> class something(object):
... def bar(self): foo()
...
>>> test = something()
>>> test.bar()
Hello World
foo
(或者我更喜欢不改变它的签名)。我能在类定义内部进行这种适应吗? - Amelio Vazquez-Reinafoo
”问题。 - Amelio Vazquez-Reina记住,当Python类调用其方法时,它会传递一个self
参数。你需要在你的代码中考虑到这一点:
def foo(self):
print ("Hello world")
class something(object):
bar = foo
test = something()
test.bar()
self
。def foo():
print ("Hello world")
class something(object):
bar = [foo] # contains pointer to static method
test = something()
test.bar[0]() # calls the static method
foo
,而只需要修改类定义本身的方法来实现这个目标。 - Amelio Vazquez-Reinatest.bar
时,实际上发生的更像是bar(test)
。你会向方法传递一个参数。类方法都有一个第一个参数,是该类的实例。因此,将参数添加到您的函数中,它就会起作用。
foo
的函数对象。由于它不属于任何类,它只是一个不带参数的函数。赋值bar = foo
只是将新名称test.bar
赋给同一个函数对象。然而,调用test.bar()
假定bar是一个类方法,并将对象test
作为该方法的第一个参数传递(通常称为self
)。您可以使用something.bar()
将其调用为静态方法而不会出现错误。