详解Python中的__new__()方法的使用


Posted in Python onApril 09, 2015

先看下object类中对__new__()方法的定义:

class object: 
    @staticmethod # known case of __new__ 
    def __new__(cls, *more): # known special case of object.__new__ 
      """ T.__new__(S, ...) -> a new object with type S, a subtype of T """ 
      pass

object将__new__()方法定义为静态方法,并且至少需要传递一个参数cls,cls表示需要实例化的类,此参数在实例化时由Python解释器自动提供。

我们来看下下面类中对__new__()方法的实现:

class Demo(object): 
    def __init__(self): 
      print '__init__() called...' 
    def __new__(cls, *args, **kwargs): 
      print '__new__() - {cls}'.format(cls=cls) 
      return object.__new__(cls, *args, **kwargs) 
  if __name__ == '__main__': 
    de = Demo()

输出:

__new__() - <class '__main__.Demo'> 
  __init__() called...

发现实例化对象的时候,调用__init__()初始化之前,先调用了__new__()方法

__new__()必须要有返回值,返回实例化出来的实例,需要注意的是,可以return父类__new__()出来的实例,也可以直接将object的__new__()出来的实例返回。

__init__()有一个参数self,该self参数就是__new__()返回的实例,__init__()在__new__()的基础上可以完成一些其它初始化的动作,__init__()不需要返回值。

若__new__()没有正确返回当前类cls的实例,那__init__()将不会被调用,即使是父类的实例也不行。

我们可以将类比作制造商,__new__()方法就是前期的原材料购买环节,__init__()方法就是在有原材料的基础上,加工,初始化商品环节。

实际应用过程中,我们可以这么使用:

class LxmlDocument(object_ref): 
    cache = weakref.WeakKeyDictionary() 
    __slots__ = ['__weakref__'] 
    def __new__(cls, response, parser=etree.HTMLParser): 
      cache = cls.cache.setdefault(response, {}) 
      if parser not in cache: 
        obj = object_ref.__new__(cls) 
        cache[parser] = _factory(response, parser) 
      return cache[parser]

该类中的__new__()方法的使用,就是再进行初始化之前,检查缓存中是否存在该对象,如果存在则将缓存存放对象直接返回,如果不存在,则将对象放至缓存中,供下次使用。

Python 相关文章推荐
python基础教程之自定义函数介绍
Aug 29 Python
30分钟搭建Python的Flask框架并在上面编写第一个应用
Mar 30 Python
Python实现JSON反序列化类对象的示例
Jan 31 Python
python:pandas合并csv文件的方法(图书数据集成)
Apr 12 Python
每天迁移MySQL历史数据到历史库Python脚本
Apr 13 Python
对python3 一组数值的归一化处理方法详解
Jul 11 Python
对tensorflow 的模型保存和调用实例讲解
Jul 28 Python
python数据结构之线性表的顺序存储结构
Sep 28 Python
Python实现制度转换(货币,温度,长度)
Jul 14 Python
Python re正则表达式元字符分组()用法分享
Feb 10 Python
Python如何创建装饰器时保留函数元信息
Aug 07 Python
Python+Opencv身份证号码区域提取及识别实现
Aug 25 Python
Python中动态获取对象的属性和方法的教程
Apr 09 #Python
详解Python中的循环语句的用法
Apr 09 #Python
python3简单实现微信爬虫
Apr 09 #Python
初步理解Python进程的信号通讯
Apr 09 #Python
详解Python中的多线程编程
Apr 09 #Python
用Python解析XML的几种常见方法的介绍
Apr 09 #Python
在Python中使用pngquant压缩png图片的教程
Apr 09 #Python
You might like
PHP生成自适应大小的缩略图类及使用方法分享
2014/05/06 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
在laravel中使用with实现动态添加where条件
2019/10/10 PHP
几个有趣的Javascript Hack
2010/07/24 Javascript
JQuery EasyUI 对话框的使用方法
2010/10/24 Javascript
Jquery 插件开发笔记整理
2011/01/17 Javascript
jquery如何判断表格同一列不同行input数据是否重复
2014/05/14 Javascript
jQuery表单美化插件jqTransform使用详解
2015/04/12 Javascript
js游戏人物上下左右跑步效果代码分享
2015/08/28 Javascript
js跨浏览器的事件侦听器和事件对象的使用方法
2015/12/17 Javascript
js轮盘抽奖实例分析
2020/04/17 Javascript
使用Angular.js实现简单的购物车功能
2016/11/21 Javascript
使用vue.js实现checkbox的全选和多个的删除功能
2017/02/17 Javascript
JS实现移动端判断上拉和下滑功能
2017/08/07 Javascript
前端防止用户重复提交js实现代码示例
2018/09/07 Javascript
Electron中实现大文件上传和断点续传功能
2018/10/28 Javascript
JQuery中queue方法用法示例
2019/01/31 jQuery
在Python中进行自动化单元测试的教程
2015/04/15 Python
Tornado协程在python2.7如何返回值(实现方法)
2017/06/22 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
2018/01/06 Python
详解tensorflow训练自己的数据集实现CNN图像分类
2018/02/07 Python
Python实现查找字符串数组最长公共前缀示例
2019/03/27 Python
Python时间序列处理之ARIMA模型的使用讲解
2019/04/02 Python
tornado+celery的简单使用详解
2019/12/21 Python
Tensorflow限制CPU个数实例
2020/02/06 Python
python 读取、写入txt文件的示例
2020/09/27 Python
IE浏览器单独写CSS样式的几种方法
2014/10/14 HTML / CSS
日本PLST在线商店:日本时尚杂志刊载的人气服装
2016/12/10 全球购物
WoolOvers爱尔兰:羊绒、羊毛和棉针织品
2017/01/04 全球购物
人事专员岗位职责
2013/11/20 职场文书
创新型城市实施方案
2014/03/06 职场文书
网站美工岗位职责
2014/04/02 职场文书
医院党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
个人先进事迹材料
2014/12/29 职场文书
大学生见习总结报告
2015/06/24 职场文书
十一月早安语录:把心放轻,人生就是一朵自在的云
2019/11/04 职场文书