详解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 相关文章推荐
用PyQt进行Python图形界面的程序的开发的入门指引
Apr 14 Python
Python中使用urllib2模块编写爬虫的简单上手示例
Jan 20 Python
Python 序列的方法总结
Oct 18 Python
Python 批量合并多个txt文件的实例讲解
May 08 Python
详解爬虫被封的问题
Apr 23 Python
django的分页器Paginator 从django中导入类
Jul 25 Python
python 接口实现 供第三方调用的例子
Aug 13 Python
Python:合并两个numpy矩阵的实现
Dec 02 Python
tensorflow 初始化未初始化的变量实例
Feb 06 Python
详解如何修改python中字典的键和值
Sep 29 Python
Python OpenCV 图像平移的实现示例
Jun 04 Python
Pytorch中expand()的使用(扩展某个维度)
Jul 15 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 中的面向对象编程:通向大型 PHP 工程的办法
2006/12/03 PHP
php使用curl出现Expect:100-continue解决方法
2015/03/03 PHP
PHP学习笔记之php文件操作
2016/06/03 PHP
Yii基于CActiveForm的Ajax数据验证用法示例
2016/07/14 PHP
在Yii2特定页面如何禁用调试工具栏Debug Toolbar详解
2017/08/07 PHP
laravel框架语言包拓展实现方法分析
2019/11/22 PHP
让whoops帮我们告别ThinkPHP6的异常页面
2020/03/02 PHP
Script的加载方法小结
2011/01/12 Javascript
关于jquery css的使用介绍
2013/04/18 Javascript
一个简单的全屏图片上下打开显示网页效果示例
2014/07/08 Javascript
JS实现文件动态顺序载入的方法
2015/03/07 Javascript
使用iojs的jsdom库实现同步系统时间
2015/04/20 Javascript
Bootstrap实现登录校验表单(带验证码)
2016/06/23 Javascript
JS常见疑难点分析之match,charAt,charCodeAt,map,search用法分析
2016/12/25 Javascript
vue.js数据绑定操作详解
2018/04/23 Javascript
JavaScript实现创建自定义对象的常用方式总结
2018/07/09 Javascript
对vue 键盘回车事件的实例讲解
2018/08/25 Javascript
关于element-ui的隐藏组件el-scrollbar的使用
2019/05/29 Javascript
移动端 Vue+Vant 的Uploader 实现上传、压缩、旋转图片功能
2019/06/10 Javascript
JS中的算法与数据结构之常见排序(Sort)算法详解
2019/08/16 Javascript
JS指定音频audio在某个时间点进行播放
2020/11/28 Javascript
python实现保存网页到本地示例
2014/03/16 Python
Python中title()方法的使用简介
2015/05/20 Python
Python读取指定目录下指定后缀文件并保存为docx
2017/04/23 Python
利用python实现对web服务器的目录探测的方法
2019/02/26 Python
通过python检测字符串的字母
2020/02/18 Python
keras 如何保存最佳的训练模型
2020/05/25 Python
Python用来做Web开发的优势有哪些
2020/08/05 Python
浅析python中的del用法
2020/09/02 Python
环境工程求职简历的自我评价范文
2013/10/24 职场文书
高级技校毕业生自荐信
2013/11/18 职场文书
大学生村官任职感言
2014/01/09 职场文书
新学期开学寄语
2014/01/18 职场文书
爱与责任演讲稿
2014/05/20 职场文书
让人瞬间清醒的句子,句句经典,字字如金
2019/07/08 职场文书
如何在Python中妥善使用进度条详解
2022/04/05 Python