python传递自引用函数

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

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

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

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
。不知道您也可以这样做。尼托!这只是给了我一个似曾相识的印象。很好,忘记了
部分
。不知道你也能做到。尼托!这只是给了我一个似曾相识的答案,如果我能选择两个答案,我会接受你的答案,如果我能选择两个答案,我也会接受你的答案