gpt4 book ai didi

python - 查找过程中如何涉及 `__getattribute__` 方法?

转载 作者:太空狗 更新时间:2023-10-30 01:26:31 24 4
gpt4 key购买 nike

Python in a Nutshell 描述:

__getattribute__方法是如何参与上述查找过程的?

  • 是否在查找过程的某处调用了 __getattribute__ 方法?

  • 或者,查找过程是通过调用 __getattribute__ 开始的,然后它会完成两个链接中的所有工作吗?

谢谢。

最佳答案

TLDR:属性查找从调用 __getattribute__ 开始,它会完成链接中提到的所有工作。根据对象的类型,调用 object.__getattribute__type.__getattribute__


任何属性查找都会在内部生成 LOAD_ATTR 字节码。

>>> import dis    
>>> dis.dis(lambda: foo.x)
1 0 LOAD_GLOBAL 0 (foo)
2 LOAD_ATTR 1 (x)
4 RETURN_VALUE

LOAD_ATTR然后调用 PyObject_GetAttr .

PyObject_GetAttr 现在寻找 tp_getattrotp_getattr(deprecated)对象类型上的插槽。

PyObject *

PyObject_GetAttr(PyObject *v, PyObject *name)
{
PyTypeObject *tp = Py_TYPE(v);
...
if (tp->tp_getattro != NULL)
return (*tp->tp_getattro)(v, name);
if (tp->tp_getattr != NULL) {
const char *name_str = PyUnicode_AsUTF8(name);
if (name_str == NULL)
return NULL;
return (*tp->tp_getattr)(v, (char *)name_str);
}
...
}

现在,如果一个对象有自己的 __getattribute__ 实现,那么它会被使用,否则它会退回到 object.__getattribute__type.__getattribute__ 基于类型。 tp_getattro slot如果 object 指向 PyObject_GenericGetAttrtype它指向 type_getattro .

PyObject_GenericGetAttrtype_getattro 基本上完成了检查描述符、字典、插槽等(基于类型)的所有工作,并尝试返回一个值。如果他们在完成所有操作后仍未找到它,则会引发 AttributeError 并且如果对象的类型已定义 __getattr__ 则将调用它。

关于python - 查找过程中如何涉及 `__getattribute__` 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44990762/

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