详解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数据类型转换函数总结
Mar 11 Python
详解Python读取配置文件模块ConfigParser
May 11 Python
详细解读tornado协程(coroutine)原理
Jan 15 Python
Python读取word文本操作详解
Jan 22 Python
详解通过API管理或定制开发ECS实例
Sep 30 Python
Python Pillow Image Invert
Jan 22 Python
使用Python给头像戴上圣诞帽的图像操作过程解析
Sep 20 Python
python子线程退出及线程退出控制的代码
Oct 16 Python
python使用matplotlib绘制雷达图
Oct 18 Python
python3读取csv文件任意行列代码实例
Jan 13 Python
python不相等的两个字符串的 if 条件判断为True详解
Mar 12 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
Jul 01 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排序之二维数组的按照字母排序实现代码
2011/08/13 PHP
PHP运行环境配置与开发环境的配置(图文教程)
2013/06/04 PHP
使用swoole扩展php websocket示例
2014/02/13 PHP
javascript 新浪背投广告实现代码
2009/07/07 Javascript
基于jquery的跨域调用文件
2010/11/19 Javascript
jQuery动态添加删除select项(实现代码)
2013/09/03 Javascript
JavaScript执行顺序详细介绍
2013/12/04 Javascript
轻松实现javascript图片轮播特效
2016/01/13 Javascript
Node.js操作mysql数据库增删改查
2016/03/30 Javascript
jQuery链式调用与show知识浅析
2016/05/11 Javascript
基于bootstrap的文件上传控件bootstrap fileinput
2016/12/23 Javascript
对称加密与非对称加密优缺点详解
2017/02/06 Javascript
使用jQuery实现鼠标点击左右按钮滑动切换
2017/08/04 jQuery
Vue 2.5.2下axios + express 本地请求404的解决方法
2018/02/21 Javascript
Angular6 正则表达式允许输入部分中文字符
2018/09/10 Javascript
jQuery内容选择器与表单选择器实例分析
2019/06/28 jQuery
Nodejs实现图片上传、压缩预览、定时删除功能
2019/10/25 NodeJs
OpenLayers加载缩放控件使用方法详解
2020/09/25 Javascript
python使用wxPython打开并播放wav文件的方法
2015/04/24 Python
Python GUI Tkinter简单实现个性签名设计
2018/06/19 Python
Python实现压缩文件夹与解压缩zip文件的方法
2018/09/01 Python
python 分离文件名和路径以及分离文件名和后缀的方法
2018/10/21 Python
python实现控制电脑鼠标和键盘,登录QQ的方法示例
2019/07/06 Python
解决django中ModelForm多表单组合的问题
2019/07/18 Python
关于Python形参打包与解包小技巧分享
2019/08/24 Python
python使用turtle库绘制奥运五环
2020/02/24 Python
Python定时任务APScheduler原理及实例解析
2020/05/30 Python
基于html5 DeviceOrientation 实现微信摇一摇功能
2015/09/25 HTML / CSS
说出ArrayList,Vector, LinkedList的存储性能和特性
2015/01/04 面试题
杭州信雅达系统.NET工程师面试试题
2015/02/08 面试题
代码中finally中的代码会不会执行
2012/02/06 面试题
双十佳事迹材料
2014/01/29 职场文书
银行贷款委托书范本
2014/10/11 职场文书
市级三好生竞选稿
2015/11/21 职场文书
导游词之太原天龙山
2020/01/02 职场文书
Django 如何实现文件上传下载
2021/04/08 Python