3

尝试将类方法绑定到函数时出现错误。为什么?

def foo():
    print "Hello world"

class something(object):
    bar = foo

test = something()
test.bar()

TypeError: foo() takes no arguments (1 given)

另外,如果我无法修改foo,我可以从类定义中进行这种调整吗?

4

6 回答 6

9

一种简单的方法是将函数包装在staticmethod内部 A 中:

class A():
    bar = staticmethod(foo)

>>> test = A()
>>> test.bar()
Hello world
于 2013-04-10T22:31:58.560 回答
4

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
于 2013-04-10T22:22:07.800 回答
1

当您以这种方式调用类方法时,您将类实例作为第一个参数传递。当你打电话时test.bar,实际上发生的事情更像是bar(test)。您将参数传递给该方法。

于 2013-04-10T22:21:51.050 回答
1

请记住,当 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
于 2013-04-10T22:22:10.253 回答
1

类方法都有类实例的第一个参数。所以在你的函数中添加一个参数,它就可以工作了。

于 2013-04-10T22:22:39.463 回答
1

初始 def 创建一个名为 的函数对象foo。由于它在任何类之外,它只是一个不带参数的函数。赋值bar = foo只是为test.bar同一个函数对象赋予了新名称。然而, calltest.bar()假定 bar 是一个类方法,并将对象test作为第一个参数传递给方法(您通常会调用的那个self)。您可以将其作为静态方法调用,但something.bar()不会出现错误。

于 2013-04-10T22:31:48.227 回答