首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

python源码阅读笔记之对象体系(一)

首先,我们来看看对象的定义:就是数据和基于这些数据的操作的集合。 python是用C编写,C里面可没有对象的概念,那这个究竟是什么呢? 在python中,对象实际是为C的结构体在堆上申请的一片内存。...让我们还是从object.h这个头文件一窥究竟吧 在文件开头,有一长串注释,在里面有下面几个要点: 1.Objects are structures allocated on the heap.这就是上面所说的...,对象实际是为C的结构体在堆上申请的一片内存。...1.C API,也就是python的C扩展包 2.内建对象的API 从上述的结构体当中,可以看到这么一段话: /* Method suites for standard classes */ PyNumberMethods...Out[9]: type 好了现在我们可以梳理一下大致的python的对象类型:(采用的《python源码剖析》里的,我觉得这里的分类很好) Fundamental对象:类型对象 Numeric对象:

48020

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

PyTorch 如何通过扩展 Python 解释器来定义可以从 Python 代码中调用的 Tensor 类型? 2. PyTorch 如何封装实际定义 Tensor 属性和方法的 C 的类库?...它负责创建(而不是初始化)该类型的对象,相当于 Python 中的__new()__方法。C 实现是一个静态方法,该方法传递实例化的类型和任意参数,并返回一个新创建的对象。...我们可以通过定义 https://docs.python.org/3.7/c-api/typeobj.html#c.PyMappingMethods 里描述的三种映射方法来使用[]符号。...定义的时候派生的。...它使用 CPython 的框架来扩展 Python 解释器并定义新的类型,同时尤其关注为所有类型生成代码。 PyTorch 如何封装实际定义 Tensor 属性和方法的 C 的类库?

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

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

    p248: 嵌套函数、闭包和 decorator  co_cellvars: 通常是一个tuple,保存嵌套的作用域内使用的变量名集合; co_freevars: 通常是一个tuple,保存使用了的外层作用域中的变量名集合...闭包从创建、传递到使用的全过程可以用以下三幅图演示: ? ? ?...基于mro 列表从基类继承属性操作(自定义类型不会继承基类属性操作到tp_dict); 5). 设置基类的子类列表在 tp_subclasses 。...'> 的 tp_alloc 即 PyType_GenericAlloc,最终申请的内存大小是  metatype->tp_basicsize + metatype->tp_itemsize,从 typeobject.c...p296: 访问和设置 instance 对象中的属性 class A(object):     name = "Python"     def __init__(self):         print

    1.2K00

    解剖 Python 类

    我们在使用 Python 语法编写程序时之所以能够一上来就定义一些复杂的类、生成复杂的类对象和实例对象,是因为 Python 在出厂时为我们包装好了各种基于类型和对象生成的类和相应类对象与实例对象(有些是内置的工具使用...类对象 | class object 类对象用于维护类的基本信息。 类对象支持两种操作:属性引用和实例化。 属性引用使用 Python 中所有属性引用所使用的标准语法:obj.name。...由于 object 没有 __dict__,因此无法将任意属性赋给 object 的实例。...除此之外,如果想了解更多 PyTypeObject 内部变量的具体意义可以访问 Python 官方文档-C API-Type Objects 进行查看。...在 Python3 中,类的继承解析使用的是 C3 算法,可以参考我的另一篇文章:Python MRO。

    36320

    Python & C++ - pybind11 实现解析

    借助 pybind11 和 Python C API, 我们可以方便的在 C++ 中创建 Python 脚本环境, 这里给出运行环境创建的一种方式: wchar_t libraryPath[] = L".... ---- 2.1.2 detail::object_api 作用如类名, 提供对 Python 对象的统一 API外观, 部分接口定义如下: 位于 pytypes.h 中: /...在处理函数的 C++ 参数传入传出处理的时候, pybind11 很多情况下是直接使用 handle 来完成相关功能的. ---- 2.1.4 object 大部分 Python 对象的 C++ 抽象都使用它来作为基类...每个从 object 继承的类都有贴合自身实现的类型检查机制, 这样保证我们不容易使用错误的类型对 Python 中的对象进行操作, 具体每个类型的作用这里不一一展开描述了, 下面再具体介绍一下 pybind11...init_instance, 析构时调用的 dealloc 等, 通过 class_ 以及内部关联的 PyTypeObject 和其上的各种定制函数, C++ 类和对象也就能被 Python 识别和使用了

    2.3K80

    python 继承与多重继承

    名称 BaseClassName 必须定义于包含派生类定义的作用域中。 也允许用其他任意表达式代替基类名称所在的位置。...(对 C++ 程序员的提示:Python 中所有的方法实际上都是 virtual 方法。) 在派生类中的重载方法实际上可能想要扩展而非简单地替换同名的基类方法。...但是,大多数 Python 代码都遵循这样一个约定:带有一个下划线的名称 (例如 _spam) 应该被当作是 API 的非仅供部分 (无论它是函数、方法或是数据成员)。...杂项说明 有时会需要使用类似于 Pascal 的“record”或 C 的“struct”这样的数据类型,将一些命名数据项捆绑在一起。...例如,如果你有一个基于文件对象来格式化某些数据的函数,你可以定义一个带有 read() 和 readline() 方法从字符串缓存获取数据的类,并将其作为参数传入。 实例方法对象也具有属性: m.

    1.5K10

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

    PyInt_Type 的 tp_base 指向其基类对象 PyBaseObject_Type,而他们的 ob_type 都指向 PyType_Type,假设定义 class A(object):pass...tp_basicsize 和 tp_itemsize 分别表示对象基本大小和元素大小,对于PyIntObject 来说没有元素大小,如果是str 即 PyVarObject,tp_itemsize 即...,进而 switch case 进行指令实现(即Python 解释器 C 源码实现)。...如p115 条目所说,PyFrameObject 的f_locals、f_globals、f_builtins 分别指向不同的名字空间,对于类or 函数的 f_locals 和 f_globals指向往往是不一样的...def f() 这条语句从语法上讲是函数声明语句,而从虚拟机实现角度看是函数对象的创建语句,即声明与定义分离在不同PyCodeObject 对象中,类也是一样的,类定义中的函数同理。

    96000

    Mysql数据库学习(四):常用Mysql C API 介绍和使用、封装一个访问Mysql数据库的类MysqlDB

    首先,环境是windows +  vs2008,Mysql数据库已经安装好,在使用之前,需要配置工程属性,附加包含目录添加 D:\Program Files\MySQL\MySQL Server 5.6...一、常用Mysql C API 介绍和使用 1.mysql_init MYSQL结构代表一个连接句柄 MYSQL*mysql_init(MYSQL*mysql); 如果mysql是NULL指针,该函数将分配...否则,将初始化对象,并返回对象的地址。如果mysql_init()分配了新的对象,当调用mysql_close()来关闭连接时。将释放该对象。...二、下面封装MysqlDB类 使用的基本是上面演示过的函数,就不多解释了,直接看代码吧。...long long MysqlDB::GetInsertId() const {     return mysql_insert_id(mysql_);  //auto_increment字段 } 具体使用方法就很简单了

    2.6K10

    比较分析C++、Java、Python、R语言的面向对象特征,这些特征如何实现的?有什么相同点?

    C++是基于类的模型 对象模型:继承 (1)  类层次结构:采用单根的类层次结构,还是任意的类层次结构? C++采用任意的类层次结构; (2)  继承方式:提供哪些继承方式?...C++允许单继承、多继承、多重继承和虚继承; 在单继承中,每个类可以有多个派生类,但是每个派生类只能有一个基类,从而形成树形结构; C++使用虚拟继承,解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题...(2)  继承方式:Java只有普通的extends继承方式 当创建一个类时,总是在继承,如果没有明确指出要继承的类,就总是隐式地从根类Object进行继承。...Python允许单继承、多继承和多重继承; 在单继承中,每个类可以有多个派生类,但是每个派生类只能有一个基类,从而形成树形结构; 对象模型:多态 多态:是指同样的消息被不同类型的对象接收时导致不同的行为...Python 采用的是引用模型:变量通过引用建立与对象的联系; Python支持静态对象和自动对象; 静态对象 所有语言的全局变量都是静态对象; 在Python语言中: 使用global声明全局变量;

    1.7K10

    day 24-1 继承

    __bases__) #在 python 中任何一个没有父类的类都是 object 类的儿子(类的祖宗) print(B....,python3 中所有类都是新式类   在类中使用 不需要传 self 参数,在类外使用必须要传 类 和 对象   查找自己所在类的父类 class Animal: def __init__(...func(self): print("C") class D(A,B,C): #调用是从左向右的顺序 pass #def func(self): #这里注释掉调用的就是...小结: 继承 : 什么是什么的关系 单继承 *****   先抽象再继承,几个类之间的相同代码抽象出来,成为父类   子类自己没有的名字,就可以使用父类的方法和属性   如果子类自己有,一定是先用自己的...经典类中 深度优先 新式类中 广度优先 python2.7 新式类和经典类共存,新式类要继承 object python3 只有新式类,默认继承 object 经典类和新式类还有一个区别 mro

    32720

    python3 入门 (四) 类与继承

    Python 类 Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。 对象可以包含任意数量和类型的数据。...python类与c++类相似,提供了类的封装,继承、多继承,构造函数、析构函数。...在python3中,所有类最顶层父类都是object类,与java类似,如果定义类的时候没有写出父类,则object类就是其直接父类。..._方法运行: 类的封装 python通过变量名命名来区分属性和方法的访问权限,默认权限相当于c++和java中的public 类的私有属性: __private_attrs:两个下划线开头,声明该属性为私有...在python中继承中的一些特点: 1:在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。使用super().

    926120

    Python基础-9 类

    类 类中的概念比较多,初学者掌握面向对象、定义和使用类、单继承、类变量和实例变量即可。迭代器和生成器是Python中迭代利器,推荐掌握。...3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx : ---- 派生类的执行过程: 派生类定义的执行过程与基类相同。...但是,大多数 Python 代码都遵循这样一个约定:带有一个下划线的名称 (例如 _spam) 应该被当作是 API 的非公有部分 (无论它是函数、方法或是数据成员)。...9.6 使用空类模拟C的结构体 有时会需要使用类似于 C 的“struct”这样的数据类型,将一些命名数据项捆绑在一起。...object at 0x10c90e650> >>> next(it) #使用next() 等价于 调用 it的__next__()方法 'a' >>> next(it) 'b' >>> next

    36150

    继承、派生、新式类与经典类

    派生指子类继承父类的属性,并且派生自己的属性。 如果子类和父类都有这个属性,以子类自己的属性为准。 继承指的是类与类的关系,子类与父类是从属关系。...sal#派生出的属性 注意:两种方式不要混着使用 新式类与经典类 新式类与经典类(了解)(面试会问) 在python2中才有经典类,没有继承object的类都是经典类。...python3中都是新式类,继承object类的都是新式类,py3中默认继承object类。...——新式类——》广度优先:从左向右查找,和经典类的区别是最后找所有分支共同的父类 ?...在python2中,凡是没有继承object的类都是经典类. 9.在多继承的情况下形成的钻石继承 (继承顺序) - 经典类: 深度优先 - 新式类: 广度优先

    57120

    连载 Python OOP指南(1)

    Python继承概述 Python中的所有内容都是一个对象。模块是对象,类定义和函数是对象,当然,从类创建的对象也是对象。 继承是每种面向对象编程语言的必需功能。...有一些附加的部件MyClass等__dict__和__weakref__,但每单件object类也存在于MyClass。 这是因为您在Python中创建的每个类都隐式地派生自object。...注意:在Python 2中,您必须object出于超出本文讨论范围的原因而明确地从中派生,但是您可以在Python 2文档的“ 新样式和经典类”部分中进行阅读。...例外是例外 您在Python中创建的每个类都将隐式派生自object。该规则的异常是用于通过引发异常来指示错误的类。...派生类必须重写该方法,以允许创建其类型的对象。 实现继承与接口继承 当您从另一个类派生一个类时,派生类将继承这两个类: 基类接口:派生类继承基类的所有方法,属性和属性。

    81710

    Python面试题之Python面向对象编程汇总

    面向对象的设计思想是从自然界中来的,因为在自然界中,类(Class)和实例(Instance)的概念是很自然的。...类和实例 类(Class)和实例(Instance)是面向对象最重要的概念。 类是指抽象出的模板。实例则是根据类创建出来的具体的“对象”,每个对象都拥有从类中继承的相同的方法,但各自的数据可能不同。...在python中定义一个类: classStudent(object): pass 关键字class后面跟着类名,类名通常是大写字母开头的单词,紧接着是(object),表示该类是从哪个类继承下来的...通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承下来的类。...实例属性和类属性 由于Python是动态语言,根据类创建的实例可以任意绑定属性。

    1.8K30

    解锁面向对象编程:Python 类与对象详解

    python从设计之初就是一门面向对象的语言,它提供一些语言特性支持面向对象编程。那么第一个问题就是什么是面向对象。1....什么是面向对象面向对象( Object-Oriented Programming)是现代编程语言都存在的一种编程方式,如果你使用过C语言会发现,每当需要实现一个功能时都需要创建一个一个的函数来实现,这是面向过程...如果你使用过C++或者JAVA就会发现,当实现一个功能时,会把这个功能需要的属性和函数抽象出来封装成一个整体,程序员再对这个整体进行操作,这个整体也就叫做类,类实例出的东西叫做对象。...对象包括两个数据成员(类变量和实例变量)和方法。python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类、派生类可以覆盖基类中的任何方法、方法中可以调用基类中的同名方法。...注意,无论是类属性还是类方法,对应类来说,它们都不是必须的,可以有也可以没有。另外,python类中的属性和方法所在的位置也是任意的,也就是说,它们是没有固定的前后顺序的。

    15400

    面向对象 类的成员

    __add() # 派生类中不能访问 私有方法 总结: 对于这些私有成员来说,他们只能在类的内部使用,不能再类的外部以及派生类中使用. *ps:非要访问私有成员的话,可以通过 对象....静态方法 ​ 定义:使用装饰器@staticmethod。参数随意,没有“self”和“cls”参数,但是方法体中不能使用类或实例的任何属性和方法; ​ 调用:实例对象和类对象都可以调用。...View Code 课外了解:元类type。 按照Python的一切皆对象理论,类其实也是一个对象,那么类这个对象是从哪里实例化出来的呢?...,而type类比较特殊,Python原则是:一切皆对象,其实类也可以理解为'对象',而type元类又称作构建类,python中大多数内置的类(包括object)以及自己定义的类,都是由type元类创造的...* 而type类与object类之间的关系比较独特:object是type类的实例,而type类是object类的子类,这种关系比较神奇无法使用python的代码表述,因为定义其中一个之前另一个必须存在

    84620

    Dart的语法详解系列篇(三)-- mixin入门详解一、继承歧义

    如果从A到B的继承和从A到C的继承都标记为virtual(例如,class B:virtual public A),那么c++会特别注意只创建一个对象,并正确使用A的成员。...如果虚拟继承和非虚拟继承是混合的,那么只有一个虚拟A,对于每个到A的非虚拟继承路径,都有一个非虚拟A。C++需要显式地声明要使用的特性是从哪个父类调用的(例如:Worker::Human.Age)。...C++不支持显式的重复继承,因为没有办法限定要使用哪个超类(例如:在一个派生列表[class Dog : public Animal, Animal]中出现一个类不止一次)。...Python使用C3线性化(或方法解析顺序(Method Resolution Order,MRO))算法创建类列表。...类只能从单个类继承,但是可以根据需要混合(mix-in)任意多的特性。Scala使用扩展的traits的右优先深度优先的搜索来解析方法名,然后除去结果列表中每个模块的最后一次出现。

    1.9K10
    领券