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. IOS 学习笔记 2015-04-03 OC-API-文件读写

    // // WPFileHelper.m // OC-API-文件操作 // // Created by wangtouwang on 15/4/3. // Copyright (c) 2015年 w ...

  2. greenplum学习

    公司TM蛋疼,动不动让你学习新东西,就是不让你闲下来,本着胳膊拧不过大腿定律,忍了,这是背景. 好吧哥端起一本厚厚的<GreenPlum企业应用实战>,打开百度开始GP的学习之路: GP只 ...

  3. 自己动手丰衣足食,h5手机端jquery弹窗插件(事件冒泡、单例模式、遮盖部分禁止默认滚动)

    感谢浏览,欢迎交流=.= 公司开发微信网页多处需要使用弹窗,使用jquery-ui的定制化下载仍需要150多kb,想来有些奢侈(最终下来只有11kb,压缩后2kb,啊,我的神), 手机端弹窗方式与pc ...

  4. vi简单快键命令

    进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文件,并将光标置于最后 ...

  5. css中 中文字体(font-family)的标准英文名称

    Mac OS的一些: 华文细黑:STHeiti Light [STXihei] 华文黑体:STHeiti 华文楷体:STKaiti 华文宋体:STSong 华文仿宋:STFangsong 儷黑 Pro ...

  6. xampp install

    the way of restart: sudo /opt/lampp/lampp restart config root: /opt/lampp/etc/httpd.conf /opt/lampp/ ...

  7. Leaflet学习笔记-Leaflet.awesome-markers

    基础篇传送门 http://www.cnblogs.com/CoffeeEddy/p/4919987.html 效果图 是不是感觉很美观啊 为什么选择awesome 地图上面需要各种各样的Mark,难 ...

  8. Entity Framework: 视图查询时重复返回第一行值, duplicate frst rows in resultset from a view

    http://blog.csdn.net/riverlau/article/details/7476449 1. 使用rownumber给view加上一个标示列 SELECT ROW_NUMBER() ...

  9. 一些嵌入式和FPGA相关模块的开源

    工作一年,整理下手头做过的东西,分享出来,希望能帮到大家. 嵌入式方面,主要集中在Xilinx家的器件上,ZYNQ居多.Linux相关的就不贴了,网上的资料太多,xilinx-wiki上资料都是比较全 ...

  10. Xcode7 修改bundle identifier

    Xcode 7 与之前的版本在修改bundle identifier的时候一点需要注意: 除了需要在.plist文件中修改, 还需要在 build setting中的 Product Bundle I ...