- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究 isinstance() 函数如何在 CPython 2.7 中工作
现在我有一个包含两个 Python 文件的示例:lib1.py lib2.py
In lib1.py:
from a.b import lib2
def func_h():
ob = lib2.X()
print(isinstance(ob, lib2.X))
In lib2.py:
class X(object):
a = 1
打印结果:True
然后我深入研究 CPython 源代码 https://github.com/python/cpython/blob/ad65d09fd02512b2ccf500f6c11063f705c9cd28/Objects/abstract.c#L2945
CPython 在哪里进行此检查:
if (Py_TYPE(inst) == (PyTypeObject *)cls)
return 1;
其中 Py_TYPE() 是宏
#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type)
有谁知道CPython在程序启动期间如何初始化或设置ob_type的线索吗?
最佳答案
通常,这种情况发生在 PyObject_Init
(或 PyObject_InitVar
,我不会再次提及,但全面存在等效的变体),或 PyObject_INIT
宏(它以更快的方式执行相同的操作,但不能保证与同一平台上构建的其他解释器二进制兼容)。 PyObject_Init
的文档说:
Initialize a newly-allocated object op with its type and initial reference. Returns the initialized object. If type indicates that the object participates in the cyclic garbage detector, it is added to the detector’s set of observed objects. Other fields of the object are not affected.
您可以看到the source in object.c
:
PyObject *
PyObject_Init(PyObject *op, PyTypeObject *tp)
{
if (op == NULL)
return PyErr_NoMemory();
/* Any changes should be reflected in PyObject_INIT (objimpl.h) */
Py_TYPE(op) = tp;
_Py_NewReference(op);
return op;
}
更多详情,请参阅 the comments in objimpl.h
.
当从 Python(或通过高级 C API)构造对象时:
__new__
方法或tp_new
插槽被调用。
super
object_new
,它调用 PyType_GenericNew
.tp_alloc
。PyType_GenericNew
调用类型的 tp_alloc
slot(Python 没有专门的方法来实现这一点)。
super
PyType_GenericAlloc
,它调用 PyObject_INIT
宏。tp_alloc
必须调用 PyObject_Init
系列函数或宏之一,或者自己执行相同的操作。C 扩展模块中的代码和内部解释器代码可能:
PyObject_New
,它分配对象并对其调用PyObject_Init
,并转换结果指针PyObject_Init
(当它知道它正在构造的类型时,不会自定义 tp_new
、tp_alloc
或 tp_init
)PyObject_Init
系列之一,或者本身执行相同的操作,就像自定义 tp_alloc
一样>PyNone
以及许多内置和扩展类型对象,在这种情况下,类型(当然也必须是静态常量)仅在结构初始值设定项中指定。关于python - PyObject.ob_type 在 CPython 2.7 中如何初始化/设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50382335/
如果您使用 -i 选项调用 cpython 解释器,它会在完成任何命令或脚本后进入交互模式。有没有办法在程序中让解释器执行此操作,即使它没有给出 -i?明显的用例是在异常情况发生时通过交互式检查状态进
我是按照官方cpython代码link here上的说明操作的.我做了一个 hg update 3.5 然后做了以下。 sudo apt-get build-dep python3.5 但它抛出了一个
我打算尝试使用 PyPy。但是我用 rust-cpython 编写的扩展(.so 文件)在使用 pypy3 执行时无法加载: ImportError: No module named 'pkg.lib
我试图配置预提交挂接,在运行预提交运行--所有文件时,我收到以下错误:。我已尝试升级pip以解决此问题pip安装--升级pip,但我收到另一个错误:。我尝试检查PIP和PIP3的版本,但现在我也收到了
我想为 android 创建电影下载应用程序以供学习。 为了方便开发,我想使用 youtube-dl 作为下载器后端。 所以我想将 Cpython 运行时和 ffmpeg(用于转换电影格式)嵌入到 A
我有一个 Windows fatal exception: code 0xc0000374 - 是的,有多处理(等待但是......)。 Google 表示异常代码 0xc0000374 表示堆损坏。
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我刚刚成功编译了 C++ 类的 Python 包装器。但是,当我尝试将模块加载到 Python 时(通过 import cell),我收到以下消息: ImportError: dynamic modu
在我用 python 函数包装的一个 C++ 源文件中,有人包含了以下内容: namespace some_namespace { static double some_double; } flo
例如,0 STORE_NAME 0 (sys) 是import sys 指令的一部分。这种指令格式有任何文档吗?更何况,这种格式是Python的标准吗?还是具体实现? 最佳答案 即Python byt
我有这个故意不高效的代码: def suffix_array_alternative_naive(s): return [rank for suffix, rank in sorted((s[
应该如何编写 CPython 扩展,以便 pydoc 提及参数名称而不是 (...)? 我关注了 official python tutorial about extending Python ,甚至
我正在尝试在运行 Raspbian Jessie 的 Raspberry Pi 上从源代码构建和安装 python 3.6.2。以下是构建过程的过程: $ ./configure --enable-o
GAE 有各种限制,其中之一是最大的可分配内存块大小为 1Mb(现在是 10 倍,但这并没有改变问题)。这一限制意味着不能在 list() 中放置超过一定数量的项目,因为 CPython 会尝试为元素
我和一个 friend 聊天,比较语言,他提到 Java 的自动内存管理优于 Python,因为 Java 有压缩,而 Python 没有——因此对于长时间运行的服务器,Python 是一个糟糕的选择
我一直在深入研究源代码,以找出打印结果的时间点。例如: >>> x = 1 >>> x + 2 3 以上两条语句编译为: 1 0 LOAD_CONST
我最近在生产系统中发现了一个潜在的错误,其中两个字符串使用身份运算符进行比较,例如: if val[2] is not 's': 我想这无论如何都会经常起作用,因为据我所知,CPython 将短的不可
Python 允许字符串乘以整数: >>> 'hello' * 5 'hellohellohellohellohello' 这是如何在 CPython 中实现的? 我特别感谢指向源代码的指针; the
我正在阅读 this page在文档中,并注意到它说 This is the full Python grammar, as it is read by the parser generator an
我目前正在制作 CPython 3.0 Python 解释器的嵌入式系统端口,我对任何引用资料或文档特别感兴趣,这些引用资料或文档提供有关版本 3.0 的代码设计和结构的详细信息,甚至是任何2.x 版
我是一名优秀的程序员,十分优秀!