gpt4 book ai didi

python - Python如何区分作为类成员的回调函数?

转载 作者:IT老高 更新时间:2023-10-28 22:22:04 28 4
gpt4 key购买 nike

请看简单的例子:

class A:
def __init__(self, flag):
self.flag = flag

def func(self):
print self.flag

a = A(1)
b = A(2)
callback_a = a.func
callback_b = b.func

callback_a()
callback_b()

结果是:

1
2

它按预期运行。但我有一个问题。在 C 中,回调函数作为指针传递。在 Python 中,它应该有类似的方法来执行此操作,因此调用者知道函数的地址。但是在我的例子中,不仅传递了函数指针,还传递了参数(self),因为同一个类的同一个方法打印出不同的结果。所以我的问题是:

  1. Python中这样的方法在内存中是否只有一个副本?我的意思是任何方法的代码都只有一个副本,在我的示例中,该方法本身不会被克隆。我认为它应该只有一份,但在这里我仍然提出这个问题以获得更多输入。

  2. 我记得 Python 中的一切都是对象。那么在我的例子中,是否有两个参数不同但只有一份代码的函数实例?

最佳答案

在 Python 中,回调不仅仅是对成员函数的引用。相反,它被“绑定(bind)”到它在创建时引用的对象。所以 a.func 创建了一个绑定(bind)到 a 的 callable,而 b.func 创建了一个绑定(bind)到 b< 的 callable/

Python 只需要在内存中实现一个 func(),但它可能会在运行时创建一个或多个“蹦床”函数来完成绑定(bind)(我不确定内部细节对此,无论如何 Python 实现之间会有所不同)。

如果打印 id(callback_a)id(callback_b) 会得到不同的结果,表明它们确实是不同的可调用对象。

关于python - Python如何区分作为类成员的回调函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10003833/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com