python 一切皆对象

原创 2015年11月17日 20:56:59

python 一切皆对象

在python中有一句话“一切皆对象”,其实在刚开始接触python的时候对这句话完全不理解,即使是看完了python基础教程也没有很好的理解这句话的含义。直到看了python的源码才对这部分有了更深入的理解。我的入门指导书是《Python源码剖析深度探索动态语言核心技术》。

在python中下列语句其实都是一个共同点:
i = 1
s = "abcde"
def foo(): pass
class C(object): pass
instance = C()
l = [1,2]
t = (1,2) 

他们在python解释器中执行的时候,都会在堆中新建了一个对象,然后把新建的对象绑定到变量名上。

i = 1              -----新建一个PyIntObject对象,然后绑定到i上
s = "abcde"        -----新建一个PyStringObject对象,绑定到s上
def foo(): pass    -----新建一个PyFunctionObject对象, 绑定到foo上
class C(object): pass    -----新建一个类对象,绑定到C上
instance = C()           -----新建一个实例对象,绑定到instance上
l = [1,2]                -----新建一个PyListObject对象,绑定到l上
t = (1,2)                -----新建一个PyTupleObject对象,绑定到t上

但是有一些是例外,他们就是python中的内建对象,比如PyInt_Type,PyString_Type,PyList_Type,他们都是全局变量,在代码中已经静态的初始化了这些类型的实现,但是这些全局变量都还要通过PyType_Ready的初始化才算真正初始化完成。

对象创建的控制

好吧,既然都是对象,那么class对象的创建(如上面例子中的C)和实例对象(如上面例子中的instance)的创建有什么不同呢?

个人觉得<type 'type'>是完成了对class对象的创建控制,而实例对象的创建主要是通过 <type 'object'>控制的。下面这张图就比较好的体现了type和object之间的关系,<type 'type'>是所有类的metaclass,而新的class都是继承于<type 'object'>,是所有类的父类,而a就是 class A的实例。
这里写图片描述

当然在代码中我们也可以控制对象创建的过程:

class Meta(type):
    def __getattribute__(*args):
        print"Metaclass getattribute invoked"
        return type.__getattribute__(*args)

class C(object):
    __metaclass__ = Meta
    def __new__(cls):
        if not hasattr(cls, 'instance'):
            cls.instance = super(C, cls).__new__(cls)
        return cls.instance
    def __getattribute__(*args):
        print  "Class getattribute invoked"
        return super(C, self).__getattribute__(*args)

在代码中__metaclass__实现了对class创建的控制,而__new__实现了对实例创建的控制,因此__new__方法应是算是class级别的。还有一个__init__方法是对每个实例的初始化,所以这个方法应该算是instance级别的。

相关文章推荐

【Python】什么是python对象

python使用对象模型来存储数据,也就是说构造任何类型的值都是一个对象。所有的python对象都拥有三个特性:身份id,类型和值。 身份id:唯一的身份标识,可以使用内建函数id()来得到,这个值可...
  • iEearth
  • iEearth
  • 2015年04月20日 09:51
  • 1114

Python学习笔记——可变对象和不可变对象

转载自:http://www.cnblogs.com/evening/archive/2012/04/11/2442788.html

Python学习笔记(二):介绍Python对象类型

以Mark Lutz著的《Python学习手册》为教程,每天花1个小时左右时间学习,争取两周完成。 --- 写在前面的话 2013-7-16 15:00 学习笔记 1,在Python中,数据以对象...

python赋值和拷贝----一切皆对象,参数皆引用

从python中copy与deepcopy的区别看python引用 撰写于 2012-09-21 分类: python 标签: python copy 概要:昨天遇到一个关于copy与de...

python对象引用_一切都是对象

对象是在内存中实实在在的,在内存中有一个地址存放他的内容的。 引用可以理解成对这个对象的地址,或者这个对象的名字 python中有一句话是“python中一切都是对象”,整数在python中是一个整数...

Python学习笔记4:一切皆对象,所有对象都是第一类的

Python学习笔记4:一切皆对象,所有对象都是第一类的 一切都是对象 在python中下列语句其实都是一个共同点: i = 1 s = "abcde" def foo(): pass clas...

python的万物皆对象以及int深入

在python语言中,万物皆对象,非常pure。不像java还有primitive data types这些非对象类型存在。 首先介绍一下is id ==这三个东西: 1、id(objec...

【美妙的Python之三】Python 对象解析

美妙的Python之Python起步        简而言之: Python 是能你无限惊喜的语言,与众不同。...

Python对象及内存管理

对象类型标准类型 Integer、Boolean、Long integer、Floating point real number、Complex number、String、List、Tuple、D...

python查看一个对象可用的方法

内置函数dir() 例如字符串: dir()
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python 一切皆对象
举报原因:
原因补充:

(最多只允许输入30个字)