python将self传递给引用的函数

时间:2015-08-31 20:01:22

标签: python

我有一个被对象调用的函数引用。我想要的是该对象将自身作为参数传递给函数,就像它通常为自己的函数做的那样。

IE我想在下面的示例中使用self.myFoo()而不是self.myFoo(self)

代码示例:

def foo(self):
    print(self.toString())

class Node:
    def __init__(self, myFoo):
        self.myFoo = myFoo

    def run(self):
        self.myFoo()

    def toString(self):
        return "Hello World"

n = Node(foo)
n.run()

3 个答案:

答案 0 :(得分:4)

问题是你将myFoo分配给了一个未绑定的函数,并且正在调用它,好像它已被绑定一样。如果您希望能够使用self.myFoo(),则需要自己将对象放入第一个arg中。

from functools import partial

def foo(self):
    print(self.toString())

class Node:
    def __init__(self, myFoo):
        self.myFoo = partial(myFoo, self)

    def run(self):
        self.myFoo()

    def toString(self):
        return "Hello World"

n = Node(foo)
n.run()

或者你可以使用

self.myFoo = types.MethodType(myFoo, self)

在你的__init__(self, myFoo)方法中,但是使用partial是更常用的,并且更通用,因为你可以使用它来为任何类型的函数而不仅仅是方法来讨论参数。

答案 1 :(得分:2)

This thread看起来像你在找什么。要在运行时将方法绑定到对象(但不是其类),您可以执行以下操作:

import types
n.foo = types.MethodType(foo, n)

答案 2 :(得分:1)

foo是一个简单的功能。要通过self.myFoo()使其可调用,您可以将其附加到类 - 而不是对象。即使Node.myFoo仍然是未绑定的功能,您也可以通过班级中的self.myFoo()来调用它。

def __init__(self, myFoo):
    Node.myFoo = myFoo