尝试将类方法绑定到函数时出错。为什么呢?
def foo():
print "Hello world"
class something(object):
bar = foo
test = something()
test.bar()
TypeError: foo() takes no arguments (1 given)
另外,如果我无法修改foo
,我可以在课程定义中进行此修改吗?
答案 0 :(得分:9)
一种简单的方法是将函数包装在A {
中的staticmethod
中
class A():
bar = staticmethod(foo)
>>> test = A()
>>> test.bar()
Hello world
答案 1 :(得分:2)
python中的类方法总是至少有一个参数,通常称为self
。此示例取自official Python tutorial:
# 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
答案 2 :(得分:1)
以这种方式调用类方法时,将类实例作为第一个参数传递。
当你致电test.bar
时,事实上更像是bar(test)
。您将参数传递给方法。
答案 3 :(得分:1)
请记住,当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
答案 4 :(得分:1)
类方法都有类的实例的第一个参数。所以在你的函数中添加一个参数就行了。
答案 5 :(得分:1)
初始def创建一个名为foo
的函数对象。因为它在任何类之外,所以它只是一个不带参数的函数。赋值bar = foo
只是将新名称test.bar
赋给同一个函数对象。但是,调用test.bar()
假定bar是一个类方法,并将对象test
作为方法的第一个参数传递(通常称为self
的方法)。您可以将其称为something.bar()
的静态方法,但不会收到错误。