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__ = Metadef __new__(cls):if not hasattr(cls, 'instance'):cls.instance = super(C, cls).__new__(cls)return cls.instancedef __getattribute__(*args):print  "Class getattribute invoked"return super(C, self).__getattribute__(*args)

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

python 一切皆对象相关推荐

  1. python class用法理解_Python小世界:彻底搞懂Python一切皆对象!

    犹记得当初学习Python的时候,对于 Python一切皆对象 很是懵逼,因为Python是面向对象的动态型语言,而在函数及高阶函数的应用中,如若对于一切皆对象不是有很透彻的了解,基础不是那么牢固的话 ...

  2. python数据符号函数等一切皆对象_第一章:Python高级编程-Python一切皆对象

    第一章:Python高级编程-Python一切皆对象 Python3高级核心技术97讲 笔记 1. Python一切皆对象 1.1 函数和类也是对象,属于Python的一等公民 "" ...

  3. python 无法初始化设备prn_彻底搞懂Python一切皆对象,面试必过

    犹记得当初学习Python的时候,对于Python一切皆对象很是懵逼,因为Python是面向对象的动态型语言,而在函数及高阶函数的应用中,如若对于一切皆对象不是有很透彻的了解,基础不是那么牢固的话,那 ...

  4. 彻底搞懂Python一切皆对象!!!

    一切皆对象 前言 简述 Python的一等公民 type.object和class的关系 总结 前言 犹记得当初学习Python的时候,对于Python一切皆对象很是懵逼,因为Python是面向对象的 ...

  5. python一切皆对象 对象都有类_Python小世界:彻底搞懂Python一切皆对象!!!

    前言 犹记得当初学习Python的时候,对于Python一切皆对象很是懵逼,因为Python是面向对象的动态型语言,而在函数及高阶函数的应用中,如若对于一切皆对象不是有很透彻的了解,基础不是那么牢固的 ...

  6. python一切皆对象的理解_Python中万物皆对象?的理解

    在很多地方都看到有过这样一句话,但是对象这个词的理解依然停留在谈朋友那个对象上-- python中一切皆为对象,一个对象的特征也称为属性(attribute).它所具有的行为也称为方法(method) ...

  7. python一切皆对象的理解_在 Python 中万物皆对象

    在 Python 中一切都是对象,并且几乎一切都有属性和方法.所有的函数都有一个内置的 __doc__ 属性,它会返回在函数源代码中定义的 doc string:sys 模块是一个对象,它有一个叫作 ...

  8. Python一切皆对象

    Python从设计之初就是一门面向对象的语言,它有一个重要的概念,即一切皆对象. Java虽然也是面向对象编程的语言,但是血统没有Python纯正.比如Java的八种基本数据类型之一int,在持久化的 ...

  9. python一切皆对象的理解_Python难点解析---初级篇2.一切皆对象

    在刚开始接触Python的时候,就一直听到一句话: 一切皆对象 那么,对于对象他有一些什么重要的属性呢. Python对象的属性 对于一个对象而言,他首先应该是具备类型这一属性,那么类型对应的则是值, ...

最新文章

  1. 失败 安装scikit_scikit-learn0.22版本最新发布
  2. Linux下计划任务和标准化工作流程
  3. 2020年服务器操作系统占有率,服务器操作系统占有率
  4. java的WebService实践(cxf)
  5. 使用puppeteer爬 EXTJS
  6. 关于百度地图api测距显示NaN的解决方案
  7. 谷歌chrome浏览器的源码分析(三)
  8. 创建一个存储函数,返回指定员工的姓名,薪水和年收入
  9. 和菜鸟一起学c++之虚函数
  10. 《团队名称》第八次团队作业:Alpha冲刺day5
  11. 破51项国际榜单纪录!解读华为云擎天架构调度求解引擎
  12. Oracle触发器6-管理触发器
  13. 为Exchange Server创建多主机名证书
  14. 寒江独钓——win内核编程读书笔记-1
  15. 中文编码--中国程序员之”银弹“?
  16. JS中的slice和splice
  17. VS2017 激活密钥
  18. Android-Binder机制
  19. 关于{高级语言和低级语言}的。谬论!思想误区!解释。author:盗墓者是个丑奴儿
  20. Rust中的面向对象编程Rusty OOP

热门文章

  1. c语言合法指数形式实型常量,c语言以下选项中合法的实型常数
  2. 多元微积分_散度3.高维散度
  3. severlet运行原理
  4. 期权卖方风险大为什么会有人愿意做,因为卖方的胜率容易盈利
  5. ROS2学习笔记2--介绍小乌龟教程和rqt
  6. 亲身经历过的上当受骗
  7. python的for语句写新的字符串_05 Python之字符串以及for循环
  8. 图像算法:数字图像处理程序大全
  9. ubuntu16.04安装搜狗拼音打办法以及相关问题处理
  10. jssc串口通信代码