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机制实现的更多相关文章

  1. [转载]python中的sys模块(二)

    #!/usr/bin/python # Filename: using_sys.py import sys print 'The command line arguments are:' for i ...

  2. [转载]python中multiprocessing.pool函数介绍

    原文地址:http://blog.sina.com.cn/s/blog_5fa432b40101kwpi.html 作者:龙峰 摘自:http://hi.baidu.com/xjtukanif/blo ...

  3. 深入理解Python中协程的应用机制: 使用纯Python来实现一个操作系统吧!!

    本文参考:http://www.dabeaz.com/coroutines/   作者:David Beazley 缘起: 本人最近在学习python的协程.偶然发现了David Beazley的co ...

  4. 转载--------Python中:self和__init__的含义 + 为何要有self和__init__

    背景 回复:我写的一些Python教程,需要的可以看看,中SongShouJiong的提问: Python中的self,__init__的含义是啥?为何要有self,__init这些东西? 解释之前, ...

  5. (转载)Python中模块的发布与安装

    模块(Module) Python中有一个概念叫做模块(module),这个和C语言中的头文件以及Java中的包很类似,比如在Python中要调用sqrt函数,必须用import关键字引入math这个 ...

  6. [转载]Python中的sys模块

    #!/usr/bin/python # Filename: cat.py import sys def readfile(filename): '''Print a file to the stand ...

  7. 转载 Python中关键字global与nonlocal的区别

    转载自CSDN 雁丘1990, 原文地址: https://blog.csdn.net/xcyansun/article/details/79672634 这篇文章写的很赞, 条理清晰, 分析循序渐进 ...

  8. Python 中函数的 收集参数 机制

    定义函数的时候,在参数前加了一个 * 号,函数可以接收零个或多个值作为参数.返回结果是一个元组. 传递零个参数时函数并不报错,而是返回一个空元组.但以上这种方法也有局限性,它不能收集关键字参数. 对关 ...

  9. python中的thread

    转载自: http://blog.sina.com.cn/s/blog_9f488855010198vn.html 正确与否未验证 python中得thread的一些机制和C/C++不同:在C/C++ ...

随机推荐

  1. spark-shell - 将结果保存成一个文件

    sqlContext.sql("""    SELECT user_no,cust_id,oper_code     FROM cui.operation_data_an ...

  2. Sumbline编译Less

    Less教程 Sublime Text 2的Less2Css插件介绍与安装 网址 http://fdream.net/blog/article/783.aspx 如果出现node.exe不是内部命令的 ...

  3. JS进制转换,浮点数相加,数字判断

    document.write("整数转换函数:parseInt(数据,底数)<br>"); document.write("10101=>" ...

  4. glibc 安装( version `GLIBC_2.14' not found")

    在ubuntu上编译的东西 拿到CentOS 下运行 提示 :“/lib64/libc.so.6: version `GLIBC_2.14' not found” 原因是ubuntu上用的libc 版 ...

  5. STM32之DMA

    一.DMA简介 1.DMA简介 DMA(Direct Memory Access:直接内存存取)是一种可以大大减轻CPU工作量的数据转移方式. CPU有转移数据.计算.控制程序转移等很多功能,但其实转 ...

  6. WebApp开发:ajax请求跨域问题的解决

    服务端:PHP 客户端:Andorid, HTML5, jQuery, ajax 现象:本想通过jQuery的ajax功能从服务器取回数据存到手机的缓存里,结果总是错误,后来想到可能是跨域问题,所以查 ...

  7. Struts, Namespace用法

    最近在用SSH框架做一个项目,在使用Struts 的namespace时遇到不少问题,现在就对struts namespace 做一个简单的介绍吧.(本文从项目结构展开叙述) (第1次写博客, 写的不 ...

  8. Android引导界面

    一.所需素材       很有必要整理一下,里面附带友盟的社会化分享组件,我就不去掉了. 二.代码 import com.umeng.update.UmengUpdateAgent; import a ...

  9. [原博客] POJ 1704 Georgia and Bob

    题目链接题意:如图,Georgia和Bob在玩游戏.一个无限长的棋盘上有N个旗子,第i个棋子的位置可以用Pi表示.现在Georgia先走.每个人每一次可以把一枚棋子向左移动任意个格子,但是不能超越其他 ...

  10. NCPC 2012 Bread Sorting

    逆序对数的应用: 逆序对数的写法有,二分,树状数组,分治: 学习一下: 树状数组版: 代码: #include<cstdio> #include<cstring> #inclu ...