我有一个被对象调用的函数引用。我想要的是该对象将自身作为参数传递给函数,就像它通常为自己的函数做的那样。
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()
答案 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