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. 用Session实现验证码

    新建一个 ashx 一般处理程序 如: YZM.ashx继承接口 IRequiresSessionState //在一般处理程序里面继承 HttpContext context 为请求上下文,包含此次 ...

  2. JS对于字符串的切割截取

    对于字符串的切割截取平时所用可能不是特别多,而且分的比较细,所以自备自查.有备无患. 由于之前所有均在一个demo测试,若是哪里打错了,敬请谅解.一些其余属性找时间继续添加. 1.函数:split() ...

  3. webapp中的日期选择

    你是否在开发webapp时,选择用哪种第三方日期选择控件绞尽脑汁? 其实不用那么麻烦,现在移动端都是WebKit内核,支持HTML5,其实只要弱弱的将input中将type="date&qu ...

  4. svn命令操作

    非超级用户:sudo 命令 svn info 查看svn地址 svn co 地址 检出仓库

  5. php获取文件mime类型Fileinfo等方法

    前几天写到使用wordpress xmlrpc api远程发布文章,如果本地服务器的文章库里某一篇待发表的wordpress文章包含图片文件时,就会使用到WordPress上传文件的API metaW ...

  6. Linux-Tcp-IP

    /* tcpcli.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include ...

  7. android SurfaceView绘制 重新学习--控制动画移动

    直接上demo,图是自己切的,将就用吧.点击左右两边分别向左右移动. public class MySurfaceView extends SurfaceView implements Callbac ...

  8. python中xrange()和range()函数的区别使用:

    1.range()函数: 函数说明:range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列. >>> #ra ...

  9. X窗口系统的协议和架构

    转自X窗口系统的协议和架构 在电脑中,X窗口系统(常称作 X11.X)是一种以位图显示的网络透明化窗口系统.本条目详述 X11 的协议及其技术架构. X C/S模型和网络透明性 X 基于C/S模型.运 ...

  10. 【POJ 1639】 Picnic Planning (最小k度限制生成树)

    [题意] 有n个巨人要去Park聚会.巨人A和先到巨人B那里去,然后和巨人B一起去Park.B君是个土豪,他家的停车场很大,可以停很多车,但是Park的停车场是比较小.只能停k辆车.现在问你在这个限制 ...