尝试将类方法绑定到函数时出现错误。为什么?
def foo():
print "Hello world"
class something(object):
bar = foo
test = something()
test.bar()
TypeError: foo() takes no arguments (1 given)
另外,如果我无法修改foo
,我可以从类定义中进行这种调整吗?
一种简单的方法是将函数包装在staticmethod
内部 A 中:
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
当您以这种方式调用类方法时,您将类实例作为第一个参数传递。当你打电话时test.bar
,实际上发生的事情更像是bar(test)
。您将参数传递给该方法。
请记住,当 python 类调用其中一个方法时,它将传入一个self
参数。您需要在代码中考虑到这一点:
def foo(self):
print ("Hello world")
class something(object):
bar = foo
test = something()
test.bar()
您可以在Python 文档中阅读所有关于类的信息
self
我能想到的不传递 a 的最简单解决方法是:
def foo():
print ("Hello world")
class something(object):
bar = [foo] # contains pointer to static method
test = something()
test.bar[0]() # calls the static method
类方法都有类实例的第一个参数。所以在你的函数中添加一个参数,它就可以工作了。
初始 def 创建一个名为 的函数对象foo
。由于它在任何类之外,它只是一个不带参数的函数。赋值bar = foo
只是为test.bar
同一个函数对象赋予了新名称。然而, calltest.bar()
假定 bar 是一个类方法,并将对象test
作为第一个参数传递给方法(您通常会调用的那个self
)。您可以将其作为静态方法调用,但something.bar()
不会出现错误。