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学习笔记——可变对象和不可变对象

转载自:http://www.cnblogs.com/evening/archive/2012/04/11/2442788.html
  • taohuaxinmu123
  • taohuaxinmu123
  • 2014年09月02日 16:40
  • 13014

Python面向对象详解

引言 提到面向对象,总是离不开几个重要的术语:多态(Polymorphism),继承(Inheritance)和封装(Encapsulation)。Python也是一种支持OOP的动态语言,本文将简...
  • carolzhang8406
  • carolzhang8406
  • 2011年10月25日 13:05
  • 34018

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

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

python(2) 万物皆对象

函数也是一个对象,也可以有属性
  • whd0310
  • whd0310
  • 2014年05月15日 18:18
  • 397

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

对象是在内存中实实在在的,在内存中有一个地址存放他的内容的。 引用可以理解成对这个对象的地址,或者这个对象的名字 python中有一句话是“python中一切都是对象”,整数在python中是一个整数...
  • qinyushuang
  • qinyushuang
  • 2017年05月08日 14:49
  • 887

深入理解Python中的面向对象

博客核心内容: 面向过程与面向对象的对比 id、type和value的讲解 类和对象的概念 初始化构造函数__init__的作用 self关键字的使用 继承的概念 组合的概念 接口的概念 抽象类的概念...
  • a2011480169
  • a2011480169
  • 2017年06月12日 06:42
  • 1823

Python中对象的理解:引用和赋值

在Python的概念来说,万物皆为对象,有些对象可变,如lists、dictionaries,有些对象不可变,如numbers、strings、bools、tuples。 函数id(object),...
  • csu54zzg
  • csu54zzg
  • 2014年04月02日 09:55
  • 869

Python的类同时创建多个对象的想法

利用字典创建类的多个对象,从而大大的方便了创建对象。并指出了字典的fromkeys方法的错误。...
  • Hanpu_Liang
  • Hanpu_Liang
  • 2017年10月09日 23:58
  • 304

python中的类,对象,方法,属性等介绍

注:这篇文章写得很好。加底纹的是我自己的理解 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象。。。。。。 ...
  • love1code
  • love1code
  • 2015年06月22日 14:47
  • 1547

关于Python中class的理解之万物皆对象

首先,要强调一点,Python中所有的东西都是对象。这包括整数、字符串、函数以及类。即万物皆对象。 #class class Animals(object): '''这是Animal类哦''...
  • three_co
  • three_co
  • 2017年11月15日 20:29
  • 919
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python 一切皆对象
举报原因:
原因补充:

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