Python实例一个类背后发生了什么


Posted in Python onFebruary 09, 2016

首先来看一个例子,正常情况下我们定义并且实例一个类如下

class Foo(object):
 
  def __init__(self):
    pass
 
obj = Foo()  # obj是通过Foo类实例化的对象

上述代码中,obj 是通过 Foo 类实例化的对象,其实,不仅 obj 是一个对象,Foo类本身也是一个对象,因为在Python中一切事物都是对象。

print type(obj) # 输出: Foo 表示,obj 对象由Foo类创建
print type(Foo) # 输出:type表示,Foo类对象由 type 类创建
如果按照一切事物都是对象的理论:对象是通过执行Foo类的构造方法创建,那么Foo类对象应该也是通过执行某个类的 构造方法 创建。

一、两个基本的类
这里和有必要提到一下在Python中有两个最基本的对象,<type ‘object'> 和 <type ‘type'>,这两个对象是所有对象的起源。

1、<type ‘type'>的类型是<type ‘type'>(它本身),<type ‘type'>的父类是<type ‘object'>
2、<type ‘object'>的类型是<type ‘type'>,<type ‘object'>没有父类
在Python对象系统中,<type ‘object'>和<type ‘type'>的关系就像鸡和蛋的关系,不能说谁先于(创建)谁,两者是相互依赖的,共同构成了Python对象系统的基础.有点难理解,不过没有关系,知道有种这么两个东西就好了,比较我们也不是设计Python的人,没有必要搞的那么清楚.

二、类的创建
主要有两种方式,不过本质上都是一样的,都是通过type类来实例一个用户类

//普通方式
  class Foo(object):
   
  def func(self):
  print 'hello wupeiqi'

//特殊方式(type类的构造函数)
  def func(self):
    print 'hello wupeiqi'
  
  Foo = type('Foo',(object,), {'func': func})
 #type第一个参数:类名
 #type第三个参数:类的成员

由上面可以看出来 , Foo类是由type类实例而来,那么具体的创建的过程是怎么样的呢,接着往下面看:

来了解几个概念
new __init()__metaclass__:

  • __new__函数是实例一个类所要调用的函数,每当我们调用obj = Foo()来实例一个类时,都是先调用__new__()
  • 然后再调用__init__()函数初始化实例. __init__()在__new__()执行后执行,
  • 类中还有一个属性 __metaclass__,其用来表示该类由 谁 来实例化创建,所以,我们可以为 __metaclass__ 设置一个type类的派生类,从而查看 类 创建的过程。

三、阐述运行过程

1、mytype产生一个叫做Foo的实例,主要的原理就是设置了,__metaclass__=MyTypoe,这样就指定mytype类来实例foo类,如果Python没有找到__metaclass__,它会继续在(父类)中寻找 __metaclass__属性,并尝试做和前面同样的操作。如果Python在任何父类中都找不到__metaclass__,它就会在模块层次中去寻找__metaclass__,并尝试做同样的操作。如果还是找不到__metaclass__,Python就会用内置的type来创建这个类对象。
2、mytype类中的__new__方法返回了一个对象,所有的Python实例都是这句代码创建的type.__new__(cls,name,bases,attrs)
3、mytype的__init__()函数初始化Foo类,在这里我们可以和在__new__()函数一样设置Foo类的attr属性,比如类中的方法,字段属性等
4、和Foo类的创建过程一样,studen类继承了Foo类,所以重复123步骤,得到一个studen类
5、当用户使用Foo()或者studen()来实例类时,会默认调用类中的_new_()方法,要是之类里面没有这个方法就到父类里面寻找__new__(),我们可以充分利用这个new函数,比如来实现Python中的单例模式,或者对类成员进行批量的修改等等.
6、产生了一个实例后马上执行__init__()函数,进行初始化实例,
7、由上面的运行结果可以看出,其中Foo和studen类的类型是<class '__main__.MyType'>,这也证明了Foo类和studen类都是由MyType实例而来…而第三个例子,可以看出Foo2类的类型是<type 'type'>,这个并不例外,Foo2继承了object类,(这个,还是跳过吧,前面已经讲过type和object相爱相杀的关系了)
总结
首先,你知道了类其实是能够创建出类实例的对象。好吧,事实上,类本身也是实例,当然,它们是元类的实例。Python中的一切都是对象,它们要么是类的实例,要么是元类的实例,除了type。type实际上是它自己的元类,在纯Python环境中这可不是你能够做到的,这是通过在实现层面耍一些小手段做到的。其次,元类是很复杂的。对于非常简单的类,你可能不希望通过使用元类来对类做修改。你可以通过其他两种技术来修改类:

1、Monkey patching
2、class decora

以上就是本文的详细内容,希望对大家的学习有所帮助。

Python 相关文章推荐
Python中的XML库4Suite Server的介绍
Apr 14 Python
使用IPython下的Net-SNMP来管理类UNIX系统的教程
Apr 15 Python
介绍Python的Django框架中的静态资源管理器django-pipeline
Apr 25 Python
python 远程统计文件代码分享
May 14 Python
Python简单计算文件夹大小的方法
Jul 14 Python
Python之str操作方法(详解)
Jun 19 Python
mac安装scrapy并创建项目的实例讲解
Jun 13 Python
Python实现基于C/S架构的聊天室功能详解
Jul 07 Python
python 函数中的参数类型
Feb 11 Python
Python抓包并解析json爬虫的完整实例代码
Nov 03 Python
Python descriptor(描述符)的实现
Nov 15 Python
flask项目集成swagger的方法
Dec 09 Python
Python中的条件判断语句基础学习教程
Feb 07 #Python
Python模拟登录验证码(代码简单)
Feb 06 #Python
Python上传package到Pypi(代码简单)
Feb 06 #Python
深入讲解Java编程中类的生命周期
Feb 05 #Python
python&amp;MongoDB爬取图书馆借阅记录
Feb 05 #Python
Python中常用操作字符串的函数与方法总结
Feb 04 #Python
Python中的字符串类型基本知识学习教程
Feb 04 #Python
You might like
新版PHP极大的增强功能和性能
2006/10/09 PHP
PHP按行读取、处理较大CSV文件的代码实例
2014/04/09 PHP
PHP版QQ互联OAuth示例代码分享
2015/07/05 PHP
zend framework重定向方法小结
2016/05/28 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
2020/02/27 PHP
鼠标经过的文本框textbox变色
2009/05/21 Javascript
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
2010/04/01 Javascript
Bootstrap table使用方法详细介绍
2016/12/09 Javascript
自定义vue组件发布到npm的方法
2018/05/09 Javascript
js实现点击展开隐藏效果(实例代码)
2018/09/28 Javascript
js 计算月/周的第一天和最后一天代码
2020/02/01 Javascript
JS如何在不同平台实现多语言方式
2020/07/16 Javascript
Python构造函数及解构函数介绍
2015/02/26 Python
python使用psutil模块获取系统状态
2016/08/27 Python
Python使用Turtle模块绘制五星红旗代码示例
2017/12/11 Python
python MysqlDb模块安装及其使用详解
2018/02/23 Python
python生成器与迭代器详解
2019/01/01 Python
Python中请不要再用re.compile了
2019/06/30 Python
python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】
2019/10/24 Python
Python post请求实现代码实例
2020/02/28 Python
Python实现转换图片背景颜色代码
2020/04/30 Python
使用K.function()调试keras操作
2020/06/17 Python
python简单实现9宫格图片实例
2020/09/03 Python
python实现简单贪吃蛇游戏
2020/09/29 Python
波兰香水和化妆品购物网站:Notino.pl
2017/11/07 全球购物
戴尔美国官方折扣店:Dell Outlet
2018/02/13 全球购物
电力公司个人求职信范文
2014/02/04 职场文书
运动会通讯稿200字
2014/02/16 职场文书
聚美优品的广告词
2014/03/14 职场文书
乡镇交通安全实施方案
2014/03/29 职场文书
我们的节日国庆活动方案
2014/08/19 职场文书
商场父亲节活动方案
2014/08/27 职场文书
2014年民政工作总结
2014/11/26 职场文书
学生会宣传部竞选稿
2015/11/21 职场文书
让文件路径提取变得更简单的Python Path库
2021/05/27 Python
CSS中妙用 drop-shadow 实现线条光影效果
2021/11/11 HTML / CSS