详解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分割和拼接字符串
Nov 01 Python
pyv8学习python和javascript变量进行交互
Dec 04 Python
Python格式化压缩后的JS文件的方法
Mar 05 Python
如何使用七牛Python SDK写一个同步脚本及使用教程
Aug 23 Python
Python 十六进制整数与ASCii编码字符串相互转换方法
Jul 09 Python
python实现录音小程序
Oct 26 Python
Python实现分段线性插值
Dec 17 Python
Python3.8中使用f-strings调试
May 22 Python
详解使用python绘制混淆矩阵(confusion_matrix)
Jul 14 Python
python tkinter 设置窗口大小不可缩放实例
Mar 04 Python
Python利用matplotlib绘制散点图的新手教程
Nov 05 Python
Python实现京东抢秒杀功能
Jan 25 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
substr()函数中文版
2006/10/09 PHP
php中一个完整表单处理实现代码
2011/11/10 PHP
探讨:如何通过stats命令分析Memcached的内部状态
2013/06/14 PHP
jquery获取多个checkbox的值异步提交给php的方法
2015/06/24 PHP
9个比较实用的php代码片段
2016/03/15 PHP
joomla组件开发入门教程
2016/05/04 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
JS 页面内容搜索,类似于 Ctrl+F功能的实现代码
2007/08/13 Javascript
jQuery 遍历- 关于closest() 的方法介绍以及与parents()的方法区别分析
2013/04/26 Javascript
使用js实现按钮控制文本框加1减1应用于小时+分钟
2013/12/09 Javascript
浅析JQuery中的html(),text(),val()区别
2014/09/01 Javascript
两种方法基于jQuery实现IE浏览器兼容placeholder效果
2014/10/14 Javascript
使用AmplifyJS组件配合JavaScript进行编程的指南
2015/07/28 Javascript
简单学习JavaScript中的for语句循环结构
2015/11/10 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(二)
2016/05/17 Javascript
Javascript设计模式之装饰者模式详解篇
2017/01/17 Javascript
完美解决浏览器跨域的几种方法(汇总)
2017/05/08 Javascript
在vue中使用setInterval的方法示例
2019/04/16 Javascript
layui富文本编辑器前端无法取值的解决方法
2019/09/18 Javascript
微信小程序用户登录和登录态维护的实现
2020/12/10 Javascript
Python使用urllib2获取网络资源实例讲解
2013/12/02 Python
对于Python中线程问题的简单讲解
2015/04/03 Python
Python的Flask框架中的Jinja2模板引擎学习教程
2016/06/30 Python
用生成器来改写直接返回列表的函数方法
2017/05/25 Python
python flask实现分页的示例代码
2018/08/02 Python
Python实现 PS 图像调整中的亮度调整
2019/06/28 Python
Python3 中sorted() 函数的用法
2020/03/24 Python
C语言中一个结构不能包含指向自己的指针吗
2012/05/25 面试题
个人自荐信
2013/12/05 职场文书
给孩子的新年寄语
2014/04/08 职场文书
交通事故协议书范文
2014/04/16 职场文书
个人评语大全
2014/05/04 职场文书
建筑安全生产责任书
2014/07/22 职场文书
2015年暑期见闻
2015/07/14 职场文书
RPM包方式安装Oracle21c的方法详解
2021/08/23 Oracle
NoSQL优缺点与MongoDB数据库简介
2022/06/05 MongoDB