gpt4 book ai didi

Python 字节码函数调用传递 self

转载 作者:太空宇宙 更新时间:2023-11-03 14:52:13 26 4
gpt4 key购买 nike

我正在尝试了解字节码的工作原理。

a.func() 是一个函数调用。对应的字节码大致是LOAD_GLOBAL aLOAD_ATTR attr,然后是0参数的CALL_FUNCTION

如果 a 是一个模块,这完全没问题。但是如果 a 是一个对象,它必须传递对象实例本身。由于 Python 在编译时无法知道 a 是模块还是对象,因此无论 a 的类型如何,字节码自然都是相同的。但是,如果 a 是一个对象,运行时系统如何处理 self 作为 func 的第一个参数?是否有一些字节码级别以下的特殊处理,表示“如果在对象上调用它,则将对象作为第一个参数添加到前面”?

最佳答案

字节码不必因不同的对象类型而不同。对象类型本身负责管理绑定(bind)行为。这包含在 descriptor protocol 中。 .

简而言之,LOAD_ATTR 通过 object.__getattribute__ hook 委托(delegate)对对象的属性访问。 :

Called unconditionally to implement attribute accesses for instances of the class.

对于模块,__getattribute__ 只是在 __dict__ 命名空间中查找名称并返回它。但是对于类和元类,如果属性支持的话,实现将调用描述符协议(protocol)。函数支持描述符协议(protocol)并在请求时返回一个绑定(bind)方法:

>>> class Foo:
... def method(self): pass
...
>>> Foo().method # access on an instance -> binding behaviour
<bound method Foo.method of <__main__.Foo object at 0x107155828>>
>>> Foo.method # access on the class, functions just return self when bound here
<function Foo.method at 0x1073702f0>
>>> Foo.method.__get__(Foo(), Foo) # manually bind the function
<bound method Foo.method of <__main__.Foo object at 0x107166da0>>

这种绑定(bind)行为也是 property 的基础, classmethodstaticmethod对象起作用(后者通过返回函数本身来消除函数的绑定(bind)行为)。

关于Python 字节码函数调用传递 self ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45074917/

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