首页
学习
活动
专区
圈层
工具
发布

Python源码分析:类的机制

-- Illustrations by Daniel Liang -- ♚ 作者:小屋子大侠,目前主要从事于python后端相关工作,使用使用python大概2年半的时间,平常喜欢分析工作中使用的工具的源码...,如supervisor,gunicorn,django等,并编写了相应的源码分析博客,除了使用工具的分析外,对python的底层实现也有相应兴趣并编写过python源码有关的博客,目前主要学习于操作系统相关内容...*/ // tp_call函数 0, /* tp_str */ (getattrofunc)type_getattro, /* tp_getattro...*/ (setattrofunc)type_setattro, /* tp_setattro */ 0, /* tp_as_buffer...对象中,对应的操作方法比如nbadd是存放在函数指针tpasnumber中,而这是另外一个结构,无法计算出nbadd相对于PyTypeObject的相对位置,由PyHeapTypeObject可以看出,

1.6K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    解剖 Python 类

    我们在使用 Python 语法编写程序时之所以能够一上来就定义一些复杂的类、生成复杂的类对象和实例对象,是因为 Python 在出厂时为我们包装好了各种基于类型和对象生成的类和相应类对象与实例对象(有些是内置的工具使用...类对象支持两种操作:属性引用和实例化。 属性引用使用 Python 中所有属性引用所使用的标准语法:obj.name。有效的属性名称是类对象被创建时存在于类命名空间中的所有名称。...类的实例化使用函数表达法。可以把类对象视为是返回该类的一个新实例的不带参数的函数。 实例化操作(“调用”类对象)会创建一个空对象。 许多类喜欢创建带有特定初始状态的自定义实例。...类对象 当我们使用编辑器在文件中定义好类的主体后,就可以使用 Python 解释器加载相关文件(模块)了,在 Python 解释器加载了相关文件(模块)后,定义好的类主体会被用来生成相应的类对象。...在有了这样的一门编程语言之后,我们就可以利用面向对象的特性和抽象思想将现实生活中的业务场景使用编程语言表达出来。 结语 本来是想好好的剖析一下 Python 中的类,结果写出这么一篇四不像来。

    56620

    如何在 Django 中同时使用普通视图和 API 视图

    在本教程中,我们将学习如何在 Django 项目中有效地管理和使用普通视图和 API 视图。我们将从基础概念开始,逐步深入,涵盖必要的配置、代码示例以及最佳实践。1....简介在现代的 Web 开发中,应用程序通常不仅提供传统的页面渲染服务,还需要暴露 API 接口以支持前后端的数据交互。Django 提供了强大的视图系统,使得开发者可以轻松地同时处理这两种类型的请求。...设置项目和应用首先,创建一个 Django 项目和一个应用(或使用现有的应用)。这里假设我们的项目名为 myproject,应用名为 myapp1。...我们将使用 Django REST Framework 来简化 API 视图的创建和管理。...确保静态文件加载正常,例如在模板中使用 {% static %} 标签引用静态文件。8. 总结通过本教程,你学习了如何在 Django 项目中同时使用普通视图和 API 视图。

    3.3K00

    如何在PowerBI中同时使用日期表和时间表

    之前两篇文章介绍了如何在powerbi中添加日期表和时间表: Power BI创建日期表的几种方式概览 在PowerBI中创建时间表(非日期表) 有朋友问到如何将这两个表关联到事实表中。...首先,由于日期表和时间表不能叠加在一起(原因在前文说过了),所以肯定是两张表单独和事实表进行关联,而事实表中日期和时间是在同一列。 ?...因此,我们需要先在powerquery中将日期和时间列拆分为日期列和时间列: 选中日期和时间列-添加列-仅时间、仅日期,添加两列,然后删除原有的列 ? 然后分别将日期表和时间表与事实表建立关联: ?...如果还想让日期和时间处在同一个坐标轴上,那么完全可以将日期和时间的各个维度拖放到坐标轴上进行展示: ?...这样我们就可以同时对日期和时间进行分析了,想分析日期、周、月、年等维度就向上钻取,想分析时、分、秒等维度就可以向下钻取。 ?

    11.5K20

    《Python 源码剖析》一些理解以及勘误笔记(2)

    p248: 嵌套函数、闭包和 decorator  co_cellvars: 通常是一个tuple,保存嵌套的作用域内使用的变量名集合; co_freevars: 通常是一个tuple,保存使用了的外层作用域中的变量名集合...tp_methods、tp_members、tp_getset 函数 集。...填充 tp_dict(自定义类型填充的是自定义函数和class 变量); 3). 确定 mro 列表在 tp_mro;  4)....而用户自定义的class 对象A,其接口是动态的,不可能在  metaclass  中静态地指定,故在利用PyType_Type 对象创建 用户自定义 class 对象A 时还需要传递 (classname...__get__(descriptor, a, A) 的执行结果         }     }     // 如果不是 data descriptor (type 同时定义了__set__ 和 __get

    1.4K00

    教程 | PyTorch内部机制解析:如何通过PyTorch实现Tensor

    在考虑这种专业化的工作原理之前,我们首先考虑如何在 Python 中定义新的类型,以及如何创建通用的 THPTensor 类型。...我们来看看我们在 PyTypeObject 中设置的 tp_new 函数: PyTypeObject THPTensorType = { PyVarObject_HEAD_INIT(NULL, 0)...注意,我们只使用了 tp_new 函数,而不是同时使用 tp_new 和 tp_init(对应于 Python 中的 __init()__函数)。...首先,YAML「声明」被解析和处理。然后,通过参数检查和提取后源代码逐个生成,定义方法头,调用底层库(如 TH)。最后,cwrap 工具允许一次处理整个文件。...它使用 CPython 的框架来扩展 Python 解释器并定义新的类型,同时尤其关注为所有类型生成代码。 PyTorch 如何封装实际定义 Tensor 属性和方法的 C 的类库?

    3.2K50

    PyTorch如何实现前向传播(1) --- 基础类(上)

    在0.4.0版本之后,Tensor和Variable 的功能进行了合并,自动微分的使用就更加简单了。现在,Variable 其实就是Tensor,只是为了向后兼容,才保留这个名字。...Tensor使用.grad_fn属性记录这个计算图的入口。 Function 内部有 forward() 和 backward() 两个方法,分别应用于正向、反向传播。...但是因为旧代码中依然使用了 Function,所以我们可能会混用这两个概念。...PyTorch会自动追踪和记录对与张量的所有操作,当前向计算完成后调用.backward()方法会自动计算梯度并且将计算结果保存到grad属性中。...要在Python中能够import torch._C,则必须要使用Python的扩展规范来导出这个符号。

    2.3K40

    Python & C++ - pybind11 实现解析

    ---- 1.2 本节小结 本节中我们通过一个简单的示例了解了 pybind11 的基本使用方法, 从示例中我们也能看到, pybind11 提供了一种简洁的语法来定义模块和在模块中注册类和函数。...通过该方法, 我们可以以纯静态的方式在父类中对子类进行访问, 高性能的完成部分依赖虚表和继承才能完成的特性. ---- 2.1.3 handle Python 本身的 GC 实现比较特殊, 区别于大多语言使用的方式...class_ 最后会在 Python 中创建一个 PyTypeObject, 并关联 C++ 类处理需要的各种函数, 如创建对象中调用的init_instance, 析构时调用的 dealloc 等,...通过 class_ 以及内部关联的 PyTypeObject 和其上的各种定制函数, C++ 类和对象也就能被 Python 识别和使用了, 具体的细节我们在第3章中详细展开. ---- 2.1.6...主要的类型有以下几个: - internals::default_meta_class: pybind11 最基础的类型, 像 tp_call, tp_setattro, tp_getattro 等自定义方法是在此处绑定的

    3.7K80

    Python C API统一槽系统:PySlot提案详解

    这些是:用于 PyType_Spec 的 PyType_From* 函数,如 PyType_FromMetaclass();用于 PyModuleDef 的 PyModule_FromDef* 函数,如...(实际上,槽是使用整数ID标记的void指针。)在PEP 793中,添加了新的模块创建API。它不再使用 PyModuleDef 结构,而是只使用一个槽数组。...例如,如果从 tp_getattr 到 tp_getattro 的过渡发生在不久的将来(比如CPython 3.17),而不是1.4,并且用户想要支持带有和不带有 tp_getattro 的CPython...正如我们从 PyTypeObject 中看到的,这种结构体的大部分在实践中往往是NULL。随着更多字段变得过时,要么浪费增长,要么我们引入新的结构体布局(同时在一段时间内保持与旧布局的兼容性)。...在单个定义中同时指定两者将被弃用(目前,Py_tp_bases 会覆盖 Py_tp_base)。这些新槽都不能与 PyType_GetSlot 一起使用。

    10410

    Pytorch 如何实现后向传播 (1)---- 调用引擎

    这些函数由参数 (由权重和偏差组成)定义,这些参数在 PyTorch 中存储在张量中。训练 NN 分两步进行: 前向传播:在前向传播中,神经网络对正确的输出做出最好的猜测。...反向传播:在反向传播中,神经网络根据其猜测中的误差成比例地调整其参数。它通过从输出向后遍历,收集关于函数参数(梯度)的误差导数,并使用梯度下降优化参数来实现这一点。...使用 _make_grads 把 grad_tensors 中的元素重新组织成tuple(list(torch.Tensor, ...))的形式。 然后利用 Variable....python世界中的输入是 torch.autograd.backward(tensors, grad_tensors),这些参数分别转换被成了C++世界中的tensors和grad_tensors变量...0xFF 参考 使用C写Python的模块

    1.9K71

    一个Tensor的生命历程(Pytorch版)

    文中涉及到大量的Pytorch的C++源码,版本为1.4.0a,适合有一定Pytorch源码基础的童鞋观看,同时也涉及到一些python中的C/C++拓展的一些基础知识,其中每一段代码的第一行表明了该代码的文件位置...下面的介绍已经比较清楚了,这个类储存了不同backend下的实现方法,同时也可以应用于Variables。...其实它是一个全局变量,用来储存各种allocator,同时配备了SetAllocator和GetAllocator来设置和获取相应的分配器: // c10/core/Allocator.cpp C10...可以看到,在native_functions.yaml中的函数uniform_还对应了两个不同平台(CPU和GPU)的方法,这里我们主要看legacy::cpu::_th_uniform_ // aten...method dispatch: CPU: legacy::cpu::_th_uniform_ CUDA: uniform_cuda_ 生成的代码如下,也就是callUnboxedOnly中根据模板元参数和函数参数实际返回并执行的函数

    98520

    深入理解Python虚拟机:super超级魔法的背后原理

    super 类作为Python虚拟机中强大的功能之一,super 可以说是 Python 对象系统基石,他可以帮助我们更灵活地使用继承和方法调用。...super类的使用 在 Python 中,我们经常使用继承来构建类的层次结构。当子类继承了父类的属性和方法时,有时我们需要在子类中调用父类的方法或属性。这就是 super 类的用武之地。...在Child类的构造函数中,我们使用super().init(name)来调用父类Parent的构造函数,以便在子类中初始化父类的属性。...多继承是指一个类可以同时继承多个父类。在Python中,每个类都有一个内置属性__mro__,它记录了方法解析顺序。MRO是根据C3线性化算法生成的,它决定了在多重继承中调用方法的顺序。...*type = NULL; // 表示从哪个类的后面开始查询,含义和 上文当中的 type 一样 PyObject *obj = NULL; // 表示传递过来的对象 PyTypeObject

    38560

    关于 Python 3.13 的规划

    希望通过以下方式实现这一目标: 使用分层编译(tiered compilation)技术,根据代码的执行频率和热度,动态地选择不同级别的优化和编译策略。...改进对象模型(object model)和类型系统(type system),增加对用户自定义类型(user-defined types)和扩展类型(extension types)的支持,提高对象操作的灵活性和效率...项目计划 根据 Python 语言的发展周期,每六个月发布一个新版本,并在每个版本中实现一些优化和改进。我们目前正在开发 3.13 版本,计划在 2023 年 6 月发布。...指令定义器负责使用自定义的 C-like DSL 来定义字节码指令的语义和行为,例如操作数类型、堆栈效果、异常处理、跟踪和检测等。...完成对象模型和类型系统的设计和实现,包括两个部分:第一部分是基于 PyObject 的对象表示法(object representation),第二部分是基于 PyTypeObject 的类型表示法(type

    69510

    关于 Python 3.13 的规划

    希望通过以下方式实现这一目标: 使用分层编译(tiered compilation)技术,根据代码的执行频率和热度,动态地选择不同级别的优化和编译策略。...改进对象模型(object model)和类型系统(type system),增加对用户自定义类型(user-defined types)和扩展类型(extension types)的支持,提高对象操作的灵活性和效率...项目计划 根据 Python 语言的发展周期,每六个月发布一个新版本,并在每个版本中实现一些优化和改进。我们目前正在开发 3.13 版本,计划在 2023 年 6 月发布。...指令定义器负责使用自定义的 C-like DSL 来定义字节码指令的语义和行为,例如操作数类型、堆栈效果、异常处理、跟踪和检测等。...完成对象模型和类型系统的设计和实现,包括两个部分:第一部分是基于 PyObject 的对象表示法(object representation),第二部分是基于 PyTypeObject 的类型表示法(type

    57110
    领券