详解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回调函数用法实例详解
Jul 02 Python
Python中使用platform模块获取系统信息的用法教程
Jul 08 Python
详解使用python的logging模块在stdout输出的两种方法
May 17 Python
influx+grafana自定义python采集数据和一些坑的总结
Sep 17 Python
Python实现的线性回归算法示例【附csv文件下载】
Dec 29 Python
Python OS模块实例详解
Apr 15 Python
让Python脚本暂停执行的几种方法(小结)
Jul 11 Python
PyCharm使用之配置SSH Interpreter的方法步骤
Dec 26 Python
基于python 将列表作为参数传入函数时的测试与理解
Jun 05 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
Jan 26 Python
python实现按日期归档文件
Jan 30 Python
python画条形图的具体代码
Apr 20 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 上传文件的方法(类)
2009/07/30 PHP
PHP5与MySQL数据库操作常用代码 收集
2010/03/21 PHP
PHP的构造方法,析构方法和this关键字详细介绍
2013/10/22 PHP
详解Yii2 之 生成 URL 的方法
2017/06/16 PHP
ajaxControlToolkit AutoCompleteExtender的用法
2008/10/30 Javascript
ie中js创建checkbox默认选中问题探讨
2013/10/21 Javascript
asp.net刷新本页面的六种方法总结
2014/01/07 Javascript
节点的插入之append()和appendTo()的用法介绍
2014/01/13 Javascript
jQuery ajax serialize() 方法使用示例
2014/11/02 Javascript
javascript基于DOM实现权限选择实例分析
2015/05/14 Javascript
谷歌Chrome浏览器扩展程序开发小记
2016/01/06 Javascript
网页前端登录js按Enter回车键实现登陆的两种方法
2016/05/10 Javascript
在JavaScript中对HTML进行反转义详解
2016/05/18 Javascript
vue绑定class与行间样式style详解
2017/08/16 Javascript
利用vue开发一个所谓的数独方法实例
2017/12/21 Javascript
关于Vue源码vm.$watch()内部原理详解
2019/04/26 Javascript
简单谈谈javascript高级特性
2019/09/04 Javascript
Vue3.0数据响应式原理详解
2019/10/09 Javascript
Python科学画图代码分享
2017/11/29 Python
Python选择网卡发包及接收数据包
2019/04/04 Python
Python识别快递条形码及Tesseract-OCR使用详解
2019/07/15 Python
python将字符串转变成dict格式的实现
2019/11/18 Python
Flask和pyecharts实现动态数据可视化
2020/02/26 Python
Ubuntu16安装Python3.9的实现步骤
2020/12/15 Python
CSS3 3D位移translate效果实例介绍
2016/05/03 HTML / CSS
基于HTML5的WebGL实现json和echarts图表展现在同一个界面
2017/10/26 HTML / CSS
工程建设实施方案
2014/03/14 职场文书
养成教育经验材料
2014/05/26 职场文书
纪念九一八事变演讲稿:青少年应树立远大理想
2014/09/14 职场文书
出资证明书范本(标准版)
2014/09/24 职场文书
2014年乡镇妇联工作总结
2014/12/02 职场文书
社区党建工作总结2015
2015/05/13 职场文书
歌剧魅影观后感
2015/06/05 职场文书
详解Apache SkyWalking 告警配置指南
2021/04/22 Servers
uwsgi+nginx代理Django无法访问静态资源的解决
2021/05/10 Servers
Shell中的单中括号和双中括号的用法详解
2022/12/24 Servers