详解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导出数据到Excel可读取的CSV文件的方法
May 12 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
Apr 02 Python
python 移动图片到另外一个文件夹的实例
Jan 10 Python
python调用matlab的m自定义函数方法
Feb 18 Python
简单了解Django ContentType内置组件
Jul 23 Python
Django中的静态文件管理过程解析
Aug 01 Python
python实现操作文件(文件夹)
Oct 31 Python
Django基于客户端下载文件实现方法
Apr 21 Python
记录模型训练时loss值的变化情况
Jun 16 Python
Python实现EM算法实例代码
Oct 04 Python
详解python的super()的作用和原理
Oct 29 Python
python基于selenium爬取斗鱼弹幕
Feb 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引用地址改变变量值的问题
2012/03/23 PHP
php根据一个给定范围和步进生成数组的方法
2015/06/19 PHP
WordPress分页伪静态加html后缀
2016/06/08 PHP
ThinkPHP模板标签eq if 中区分0,null,false的方法
2017/03/24 PHP
php 浮点数比较方法详解
2017/05/05 PHP
在次封装easyui-Dialog插件实现代码
2010/11/14 Javascript
javascript开发随笔一 preventDefault的必要
2011/11/25 Javascript
JS实现的打字机效果完整实例
2016/06/20 Javascript
老生常谈javascript中逻辑运算符&amp;&amp;和||的返回值问题
2017/04/13 Javascript
详解Vue.js搭建路由报错 router.map is not a function
2017/06/27 Javascript
基于对象合并功能的实现示例
2017/10/10 Javascript
js获取html页面代码中图片地址的实现代码
2018/03/05 Javascript
Vue-Cli 3.0 中配置高德地图的两种方式
2019/06/19 Javascript
antd多选下拉框一行展示的实现方式
2020/10/31 Javascript
[36:09]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
django实现分页的方法
2015/05/26 Python
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
2018/01/10 Python
使用python编写简单的小程序编译成exe跑在win10上
2018/01/15 Python
修复 Django migration 时遇到的问题解决
2018/06/14 Python
Ubuntu下Python2与Python3的共存问题
2018/10/31 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
2019/01/23 Python
使用pyecharts生成Echarts网页的实例
2019/08/12 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
2019/08/20 Python
python实现的config文件读写功能示例
2019/09/24 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
2020/11/05 Python
详解CSS的border边框属性及其在CSS3中的新特性
2016/05/10 HTML / CSS
大学生简历的个人自我评价
2013/12/04 职场文书
演讲稿开场白
2014/01/13 职场文书
求职面试个人自我评价
2014/02/28 职场文书
安全保卫工作竞聘材料
2014/08/25 职场文书
大学生见习期满自我鉴定
2014/09/13 职场文书
大学生自我评价200字(4篇)
2014/09/17 职场文书
银行自荐信怎么写
2015/03/05 职场文书
在 HTML 页面中使用 React的场景分析
2022/01/18 Javascript
Java中的Kotlin 内部类原理
2022/06/16 Java/Android
vue递归实现树形组件
2022/07/15 Vue.js