转载:Python中的new style class机制实现
1.Python中的对象模型
python中所有东西都是对象
class对象:表示Python内置的类型和定义的类型
instance对象(实例对象):表示由class对象创建的实例
1.1 对象间的关系
is-kind-of关系:对应于面向对象中的基类与子类之间的关系
is-instance-of关系:对应于面向对象中类与实例之间的关系
<class A>表示名为A的class对象
<instance a>表示名为a的instance对象
class A 定义了一个名为A的class
class 对象表示在Python中的实现
通过对象的__class__属性或Python内置的type方法可以探测一个对象和哪个对象存在is-instance-of关系
通过对象的__bases__属性可可以探测一个对象和哪个对象存在is-kind-of关系
通过内置方法issubclass和isinstanceof判断两个对象间是否存在何种关系

>>> class A(object): //A是类对象
... pass
...
>>> a=A() //a是实例对象
>>> a.__class__ //a是A的实例
<class '__main__.A'>
>>> type(a)
<class '__main__.A'>
>>> A.__class__ //类对象A是type的实例
<type 'type'>
>>> type(A)
<type 'type'>
>>> object.__class__ //类对象object是type的实例
<type 'type'>
>>> type(object)
<type 'type'>
>>> A.__base__ //类对象A的基类是object
<type 'object'>
>>> object.__bases__
()
>>> a.__bases__ //a是实例对象,不是类对象
Traceback (most recent call last):
File "<stdin>", line , in <module>
AttributeError: 'A' object has no attribute '__bases__'
>>> isinstance(a,A)
True
>>> issubclass(A,object)
True
>>> <type 'type'>属于Python中的一类特殊的class对象,这种特殊的class对象能够成为其他class对象的type。这种特殊的class对象称为metaclass对象
>>> object.__class__
<type 'type'>
>>> type.__class__
<type 'type'>
>>> type.__bases__
(<type 'object'>,)
>>> int.__class__
<type 'type'>
>>> int.__bases__
(<type 'object'>,)
>>> dict.__class__
<type 'type'>
>>> dict.__bases__
(<type 'object'>,)

任何一个对象都有一个type,可以通过对象的__class__属性获得
任何一个instance对象的type都是一个class对象,而任何一个class对象的type都是metaclass对象
任何一个class对象都直接或间接与<type 'object'>对象之间存在is-kind-of关系,包括<type 'type'>
2 从type对象到class对象
可调用性(callable)
只要一个对象对应的class对象中实现了"__call__"操作,也就是说在Python内部的PyTypeObject中,tp_call不为空
在Python中,所谓"调用",就是执行对象的type所对应的class对象的tp_call操作
一个对象是否可调用并不是在编译期能确定的,必须是在运行时才能在PyObject_CallFunctionObjArgs中确定
2.1 处理基类和type信息
对于指定了tp_base的内置class对象,当然就使用指定的基类,而对于没有指定的tp_base的内置class对象,Python将为其指定一个默认的基类:PyBaseObject_Type
就是特殊的<type 'object'>
Python所有class对象都是直接或间接以<type 'object'>作为基类的。
PyType_Type没有指定基类,它的基类为<type 'object'>
判断基类是否已经被初始化完成的调试是base->tp_dict是否为NULL,初始化的一部分工作就是对tp_dict进行填充
2.2 处理基类列表
Python支持多重继承,每一个Python的class对象都会有一个基类列表
slot这一部分没有弄明白
MRO
Python虚拟机对Python的内置类型对应的PyTypeObject进行了多种复杂的改造工作:
a.设置type信息、基类及基类列表
b.填充tp_dict
c.确定mro列表
d.基于mro列表从基类继承操作
e.设置基类的子类列表
3.用户自定义class
类的成员函数和一般的函数相同,同样会有这种声明和实现分离的现象
创建class对象和创建instance对象的不同之处正是在于tp_new不同。创建class对象,Python虚拟机使用的是type_new
而对于instance对象,Python虚拟机则使用object_new
转载:Python中的new style class机制实现的更多相关文章
- [转载]python中的sys模块(二)
#!/usr/bin/python # Filename: using_sys.py import sys print 'The command line arguments are:' for i ...
- [转载]python中multiprocessing.pool函数介绍
原文地址:http://blog.sina.com.cn/s/blog_5fa432b40101kwpi.html 作者:龙峰 摘自:http://hi.baidu.com/xjtukanif/blo ...
- 深入理解Python中协程的应用机制: 使用纯Python来实现一个操作系统吧!!
本文参考:http://www.dabeaz.com/coroutines/ 作者:David Beazley 缘起: 本人最近在学习python的协程.偶然发现了David Beazley的co ...
- 转载--------Python中:self和__init__的含义 + 为何要有self和__init__
背景 回复:我写的一些Python教程,需要的可以看看,中SongShouJiong的提问: Python中的self,__init__的含义是啥?为何要有self,__init这些东西? 解释之前, ...
- (转载)Python中模块的发布与安装
模块(Module) Python中有一个概念叫做模块(module),这个和C语言中的头文件以及Java中的包很类似,比如在Python中要调用sqrt函数,必须用import关键字引入math这个 ...
- [转载]Python中的sys模块
#!/usr/bin/python # Filename: cat.py import sys def readfile(filename): '''Print a file to the stand ...
- 转载 Python中关键字global与nonlocal的区别
转载自CSDN 雁丘1990, 原文地址: https://blog.csdn.net/xcyansun/article/details/79672634 这篇文章写的很赞, 条理清晰, 分析循序渐进 ...
- Python 中函数的 收集参数 机制
定义函数的时候,在参数前加了一个 * 号,函数可以接收零个或多个值作为参数.返回结果是一个元组. 传递零个参数时函数并不报错,而是返回一个空元组.但以上这种方法也有局限性,它不能收集关键字参数. 对关 ...
- python中的thread
转载自: http://blog.sina.com.cn/s/blog_9f488855010198vn.html 正确与否未验证 python中得thread的一些机制和C/C++不同:在C/C++ ...
随机推荐
- 解决Mysql的主从数据库没有同步的两种方法
今天发现Mysql的主从数据库没有同步 先上Master库: mysql>show processlist; 查看下进程是否Sleep太多.发现很正常.show master status; ...
- gitlab的安装以及汉化
gitlab的安装 首先在网上下载好任意版本gitlab的rpm包 推荐下面的地址: https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gi ...
- Qt文件信息获取之QFileInfo
在Qt中为文件的操作和信息获取提供了许多方便的类,常用的有QDir,QFile,QFileInfo以及QFileDialog,在本文中主要介绍用于获取关于文件信息的QFileInfo类. QFileI ...
- jQuery EasyUI 提示框(Messager)用法
jQuery EasyUI 提示框(Messager)不仅强大,而且也不用任何的HTML代码,只需要按照<jQuery EasyUI框架使用文档>包含必要文件后,在$(function() ...
- (转载)StringGrid常用属性和常用操作
Delphi StringGrid常用属性和常用操作 StringGrid组件用于建立显示字符串的网格,与电子表格相似.它可使表格中的字符串和相关对象操作简单化.StringGrid组件提供了许多可控 ...
- hadoop1——map到reduce中间的shuffle过程
---恢复内容开始--- shuffle和排序 过程图如下: MapReduce确保每个reduce的输入都按键排序,系统执行排序的过程——将map输出作为输入传给reduce——成为shuffle, ...
- We7在政府门户中的应用
政府门户从传统的信息引导发展到现阶段的服务型门户,不论从角度转变上还是从平台选型上都跟以前有很大的不同,其更注重的是安全.扩展.易用和移动互联网几部分(当然这儿的注重是建立在已有政府门户电子政务三个板 ...
- “typedef int (init_fnc_t) (void);“的含义
在读uboot的lib_arm/board.c中的start_armboot ()函数遇到了"init_fnc_t **init_fnc_ptr;”一句话,后来查看init_fnt_t数据类 ...
- 对ARM9哈佛结构的认识
书本上都说ARM是哈佛结构,但是我总感觉好像看不出来.后来针对S3C2440的ARM9核进行分析,我有了自己的见解. 我的结论是“ARM9被称为是哈佛结构是从它拥有指令cache和数据cache”来说 ...
- iOS --- 取整数
Objective-C拓展了C,自然很多用法是和C一致的.比如浮点数转化成整数,就有以下四种情况. 1.简单粗暴,直接转化 float f = 1.5; int a; a = (int)f; NSLo ...