详解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 相关文章推荐
压缩包密码破解示例分享(类似典破解)
Jan 17 Python
python中的五种异常处理机制介绍
Sep 02 Python
python3生成随机数实例
Oct 20 Python
linecache模块加载和缓存文件内容详解
Jan 11 Python
微信跳一跳python自动代码解读1.0
Jan 12 Python
python Manager 之dict KeyError问题的解决
Dec 21 Python
在keras中获取某一层上的feature map实例
Jan 24 Python
python selenium自动化测试框架搭建的方法步骤
Jun 14 Python
Python openpyxl 插入折线图实例
Apr 17 Python
python实现启动一个外部程序,并且不阻塞当前进程
Dec 05 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
Jan 08 Python
Python如何实现Paramiko的二次封装
Jan 30 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类
2006/11/27 PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
2015/03/03 PHP
php实现连接access数据库并转txt写入的方法
2017/02/08 PHP
张孝祥JavaScript学习阶段性总结(2)--(X)HTML学习
2007/02/03 Javascript
理解Javascript_11_constructor实现原理
2010/10/18 Javascript
JS 无限级 Select效果实现代码(json格式)
2011/08/30 Javascript
css样式标签和js语法属性区别
2013/11/06 Javascript
JavaScript使用循环和分割来替换和删除元素实例
2014/10/13 Javascript
Dojo Javascript 编程规范 规范自己的JavaScript书写
2014/10/26 Javascript
js中的关联数组与普通数组详解
2016/07/27 Javascript
jQ处理xml文件和xml字符串的方法(详解)
2016/11/22 Javascript
Vue.js第三天学习笔记(计算属性computed)
2016/12/01 Javascript
微信小程序 小程序制作及动画(animation样式)详解
2017/01/06 Javascript
JS操作input标签属性checkbox全选的实现代码
2017/03/02 Javascript
layui内置模块layim发送图片添加加载动画的方法
2019/09/23 Javascript
Javascript Symbol原理及使用方法解析
2020/10/22 Javascript
vue实现顶部菜单栏
2020/11/08 Javascript
js中实现继承的五种方法
2021/01/25 Javascript
asyncio 的 coroutine对象 与 Future对象使用指南
2016/09/11 Python
Python  pip安装lxml出错的问题解决办法
2017/02/10 Python
python之线程通过信号pyqtSignal刷新ui的方法
2019/01/11 Python
如何使用Python实现自动化水军评论
2019/06/26 Python
python gdal安装与简单使用
2019/08/01 Python
Python unittest基本使用方法代码实例
2020/06/29 Python
用于ETL的Python数据转换工具详解
2020/07/21 Python
Bibloo匈牙利:女装、男装、童装及鞋子和配饰
2019/04/14 全球购物
幸福家庭事迹材料
2014/02/03 职场文书
中学生获奖感言
2014/02/04 职场文书
师德建设实施方案
2014/03/21 职场文书
初中班级口号
2014/06/09 职场文书
创先争优公开承诺书
2014/08/30 职场文书
科技活动周标语
2014/10/08 职场文书
商务宴请邀请函范文
2015/02/02 职场文书
单位实习介绍信
2015/05/05 职场文书
工作服管理制度范本
2015/08/06 职场文书
SQL Server2019安装的详细步骤实战记录(亲测可用)
2022/06/10 SQL Server