转载: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++ ...
随机推荐
- 锋利的Jquery解惑系列(三)------ 各路选择器大聚会
申明:初次学习Jquery的选择器时只记得几个和css选择器类似的几个,在这里列出书上写上的各路选择器方便以后的查询和现在的学习 所有例子都来自书上 测试画面: 一.基本选择器 #id, $(&quo ...
- CentOs install oracle instant client
rpm -ivh oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpm rpm -ivh oracle-instantclient11.2-de ...
- 代码笔记-触摸事件插件hammer.js使用
如果要使用jquery,则需要下载jquery.hammer.min.js版本 新建一个hammer对象生成的对象是dom对象,不能直接使用jqeury 的 $(this)方法,需要先将其转成jqu ...
- php购物车原理
<?php/*购物车原理在产品展示页面时(如 shop.php?id=888),点击购买或添加到购物车时,根据相应的产品标识符(如 id),查询相应的数据库,如果查询表示有此产品,用 $_SES ...
- Oracle数据库小知识,改数据库数据
在一张表上面右键-->查询数据,会生成sql语句,表后面带有t,表示模糊查询, 后面跟上for update之后,执行语句-->小锁(编辑数据)就可以修改数据里面的数据了,修改之后--&g ...
- 【转】Ext JS xtype
原文:Ext 中xtype一览 基本组件: xtype Class 描述 button Ext.Button 按钮 splitbutton Ext.SplitButton 带下拉菜单的按钮 cyc ...
- PHP-Wamp集成包安装教程
在Windows平台上搭建PHP的开发环境可以下载WAMP(Windows.Apache.MySQL.PHP的首字母缩写)集成化安装包.这样就不需要单独安装Apache.MySQL和PHP了. 这款软 ...
- ThinkPHP下使用Ueditor
在做课程设计的时候想到用百度的Ueditor,可在配置的时候出现了一些问题 Ueditor感觉不是很难,以前有个人定制的,现在取消了这项服务,但是我们可以自己进行配置 下载地址:http://uedi ...
- Aircrack-ng官方文档翻译[中英对照]---Aireplay-ng
Aircrack-ng官方文档翻译---Aireplay-ng[90%] Description[简介] Aireplay-ng is used to inject frames. Aireplay- ...
- Jersey的异常处理
Jersey框架为我们提供了更为通用异常处理方式.通过实现ExceptionMapper接口并使用@Provider注解将其定义为一个Provider,可以实现通用的异常的面向切面处理,而非针对某一个 ...