详解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中使用md5sum检查目录中相同文件代码分享
Feb 02 Python
Python中的下划线详解
Jun 24 Python
python使用xpath中遇到:到底是什么?
Jan 04 Python
matplotlib作图添加表格实例代码
Jan 23 Python
python实现简单遗传算法
Mar 19 Python
Python爬虫之正则表达式基本用法实例分析
Aug 08 Python
python matplotlib实现双Y轴的实例
Feb 12 Python
python常用数据重复项处理方法
Nov 22 Python
python turtle工具绘制四叶草的实例分享
Feb 14 Python
VS2019+python3.7+opencv4.1+tensorflow1.13配置详解
Apr 16 Python
Python更换pip源方法过程解析
May 19 Python
python三引号如何输入
Jul 06 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
5种PHP创建数组的实例代码分享
2014/01/17 PHP
PHP静态成员变量和非静态成员变量详解
2017/02/14 PHP
Thinkphp结合ajaxFileUpload实现异步图片传输示例
2017/03/13 PHP
PHP实现链式操作的三种方法详解
2017/11/16 PHP
PHP中number_format()函数的用法讲解
2019/04/08 PHP
JS获取IUSR_机器名和IWAM_机器名帐号的密码
2006/12/06 Javascript
js自执行函数的几种不同写法的比较
2012/08/16 Javascript
整理的比较全的event对像在ie与firefox浏览器中的区别
2013/11/25 Javascript
javascript如何判断输入的url是否正确
2014/04/11 Javascript
JS中this上下文对象使用方式
2016/10/09 Javascript
Node.js中文件操作模块File System的详细介绍
2017/01/05 Javascript
JavaScript实现QQ列表展开收缩扩展功能
2017/10/30 Javascript
Vue项目服务器部署之子目录部署方法
2019/05/12 Javascript
vue中nextTick用法实例
2019/09/11 Javascript
微信小程序实现一张或多张图片上传(云开发)
2019/09/25 Javascript
Openlayers绘制聚合标注
2020/09/28 Javascript
[01:41]DOTA2超级联赛专访YYF 称一辈子难忘TI2
2013/05/28 DOTA
教你用Type Hint提高Python程序开发效率
2016/08/08 Python
Python处理文本文件中控制字符的方法
2017/02/07 Python
解决python selenium3启动不了firefox的问题
2018/10/13 Python
python 多进程共享全局变量之Manager()详解
2019/08/15 Python
Python3简单爬虫抓取网页图片代码实例
2019/08/26 Python
python网络爬虫 CrawlSpider使用详解
2019/09/27 Python
Python while true实现爬虫定时任务
2020/06/08 Python
Python如何对齐字符串
2020/07/30 Python
英国在线女鞋目的地:SIMMI
2018/12/27 全球购物
Chain Reaction Cycles俄罗斯:世界上最大的在线自行车商店
2019/08/27 全球购物
超市业务员岗位职责
2013/12/05 职场文书
最新大学职业规划书范文
2013/12/30 职场文书
经济管理自荐书
2014/06/09 职场文书
影子教师研修方案
2014/06/14 职场文书
2014学校领导四风问题对照检查材料思想汇报
2014/09/22 职场文书
优秀校长事迹材料
2014/12/24 职场文书
村党组织公开承诺书
2015/04/30 职场文书
创业计划之特色精品店
2019/08/12 职场文书
Nginx虚拟主机的搭建的实现步骤
2022/01/18 Servers