python传递自引用函数
我有一个被对象调用的函数引用。我想要的是,这个对象将自己作为参数传递给函数,就像它通常为自己的函数所做的那样 IE我想在下面的示例中使用self.myFoo()而不是self.myFoo(self) 代码示例:python传递自引用函数,python,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): sel
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()
foo
是一个简单的函数。要通过self.myFoo()
调用它,可以将其附加到类,而不是对象。即使Node.myFoo
仍然是一个未绑定的函数,您可以通过类中的self.myFoo()
调用它
def __init__(self, myFoo):
Node.myFoo = myFoo
foo
是一个简单的函数。要通过self.myFoo()
调用它,可以将其附加到类,而不是对象。即使Node.myFoo
仍然是一个未绑定的函数,您可以通过类中的self.myFoo()
调用它
def __init__(self, myFoo):
Node.myFoo = myFoo
问题是您将myFoo分配给了一个未绑定的函数,并且正在调用它,就像它被绑定一样。如果希望能够使用
self.myFoo()
,则需要自己将对象插入第一个参数中
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)
在您的
\uuuuu init\uuuuuuuuuuuuo(self,myFoo)
方法中,使用partial更常见,也更通用,因为您可以使用它来为任何类型的函数(而不仅仅是方法)提供参数。问题在于,您将myFoo分配给了一个未绑定的函数,并将其调用为绑定函数。如果希望能够使用self.myFoo()
,则需要自己将对象插入第一个参数中
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)
在\uuuu init\uuuuuuu(self,myFoo)
方法中,使用partial更常见,也更通用,因为您可以使用它为任何类型的函数(而不仅仅是方法)插入参数。看起来就像您正在寻找的那样。要在运行时将方法绑定到对象(但不是其类),可以执行以下操作:
import types
n.foo = types.MethodType(foo, n)
看起来像你要找的。要在运行时将方法绑定到对象(但不是其类),可以执行以下操作:
import types
n.foo = types.MethodType(foo, n)
你为什么要避免self.myFoo(self)?没什么,只是好奇self.myFoo()为什么不工作;另外,如果我能让它工作,
def foo(self)
中的self
是误导性的。我认为代码不会运行。它不会运行,您必须将self.myFoo()替换为self.myFoo(self)才能运行run@vttran:位置参数名称self
有效,但您是对的,它具有误导性且不理想。类似地,您可以将方法的第一个参数重命名为任何您想要的名称,但“self”是相当标准的。为什么您试图避免self.myFoo(self)
?没什么,主要是好奇self.myFoo()为什么不起作用;另外,如果我能让它工作,def foo(self)
中的self
是误导性的。我认为代码不会运行。它不会运行,您必须将self.myFoo()替换为self.myFoo(self)才能运行run@vttran:位置参数名称self
有效,但您是对的,它具有误导性且不理想。类似地,您可以将方法的第一个参数重命名为任何您想要的,但“self”是相当标准的。很好的一个,忘记了partial
。不知道您也可以这样做。尼托!这只是给了我一个似曾相识的印象。很好,忘记了部分。不知道你也能做到。尼托!这只是给了我一个似曾相识的答案,如果我能选择两个答案,我会接受你的答案,如果我能选择两个答案,我也会接受你的答案