详解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 相关文章推荐
Django中模型Model添加JSON类型字段的方法
Jun 17 Python
Python3利用Dlib19.7实现摄像头人脸识别的方法
May 11 Python
使用matplotlib画散点图的方法
May 25 Python
python实现下载pop3邮件保存到本地
Jun 19 Python
python实现转盘效果 python实现轮盘抽奖游戏
Jan 22 Python
Python如何爬取实时变化的WebSocket数据的方法
Mar 09 Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
Apr 26 Python
基于YUV 数据格式详解及python实现方式
Dec 09 Python
TensorFlow Saver:保存和读取模型参数.ckpt实例
Feb 10 Python
浅谈pytorch中的BN层的注意事项
Jun 23 Python
Python如何优雅删除字符列表空字符及None元素
Jun 25 Python
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
Apr 27 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解析html类库simple_html_dom的转码bug
2014/05/22 PHP
深入浅出讲解:php的socket通信原理
2016/12/03 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
2018/05/23 PHP
PHP __call()方法实现委托示例
2019/05/20 PHP
详解使用php-cs-fixer格式化代码
2020/09/16 PHP
javascript动态添加表格数据行(ASP后台数据库保存例子)
2010/05/08 Javascript
Javascript中的变量使用说明
2010/05/18 Javascript
js replace 与replaceall实例用法详解
2013/08/03 Javascript
用JS做的简单的可折叠的两级树形菜单
2013/09/21 Javascript
JS图片自动轮换效果实现思路附截图
2014/04/30 Javascript
js函数调用的方式
2014/05/06 Javascript
javascript中的 object 和 function小结
2016/08/14 Javascript
babel基本使用详解
2017/02/17 Javascript
JSONP跨域请求
2017/03/02 Javascript
详解操作虚拟dom模拟react视图渲染
2018/07/25 Javascript
通过扫小程序码实现网站登陆功能
2019/08/22 Javascript
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
2019/11/18 NodeJs
JavaScript碰撞检测原理及其实现代码
2020/03/12 Javascript
[02:43]2014DOTA2国际邀请赛 官方Alliance战队纪录片
2014/07/14 DOTA
python连接mysql数据库示例(做增删改操作)
2013/12/31 Python
python 循环遍历字典元素的简单方法
2016/09/11 Python
Python实现自定义函数的5种常见形式分析
2018/06/16 Python
Python实现获取本地及远程图片大小的方法示例
2018/07/21 Python
python把ipynb文件转换成pdf文件过程详解
2019/07/09 Python
如何安装并使用conda指令管理python环境
2019/07/10 Python
python实现对列表中的元素进行倒序打印
2019/11/23 Python
Python创建一个元素都为0的列表实例
2019/11/28 Python
python绘制彩虹图
2019/12/16 Python
如何使用selenium和requests组合实现登录页面
2020/02/03 Python
keras 简单 lstm实例(基于one-hot编码)
2020/07/02 Python
Magee 1866官网:Donegal粗花呢外套和大衣专家
2019/11/01 全球购物
双立人美国官方商店:ZWILLING集团餐具和炊具
2020/05/07 全球购物
素质教育标语
2014/06/27 职场文书
安全检查汇报材料
2014/12/26 职场文书
杭州西湖英语导游词
2015/02/03 职场文书
postgresql 删除重复数据案例详解
2021/08/02 PostgreSQL