将类方法绑定到外部函数

时间:2013-04-10 22:18:59

标签: python oop methods

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

def foo():
    print "Hello world"

class something(object):
    bar = foo

test = something()
test.bar()

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

另外,如果我无法修改foo,我可以在课程定义中进行此修改吗?

6 个答案:

答案 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()

您可以在Python Documentation

中阅读有关课程的所有内容

最简单的解决方法是不传递我能想到的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()的静态方法,但不会收到错误。