详解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  pip安装lxml出错的问题解决办法
Feb 10 Python
Python中矩阵库Numpy基本操作详解
Nov 21 Python
Python编程实现二分法和牛顿迭代法求平方根代码
Dec 04 Python
python实现识别手写数字 python图像识别算法
Mar 23 Python
Python使用分布式锁的代码演示示例
Jul 30 Python
用Python编写一个高效的端口扫描器的方法
Dec 20 Python
对python pandas读取剪贴板内容的方法详解
Jan 24 Python
scikit-learn线性回归,多元回归,多项式回归的实现
Aug 29 Python
Python tkinter三种布局实例详解
Jan 06 Python
解决Pycharm的项目目录突然消失的问题
Jan 20 Python
opencv 阈值分割的具体使用
Jul 08 Python
Python如何创建装饰器时保留函数元信息
Aug 07 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/06/09 PHP
php输入数据统一类实例
2015/02/23 PHP
php判断当前操作系统类型
2015/10/28 PHP
广告显示判断
2006/08/31 Javascript
推荐10个超棒的jQuery工具提示插件
2011/10/11 Javascript
情人节专属 纯js脚本1k大小的3D玫瑰效果
2012/02/11 Javascript
js导出格式化的excel 实例方法
2013/07/17 Javascript
json实现前后台的相互传值详解
2015/01/05 Javascript
js制作简易年历完整实例
2015/01/28 Javascript
jquery实现在网页指定区域显示自定义右键菜单效果
2015/08/25 Javascript
JS闭包用法实例分析
2017/03/27 Javascript
基于vue1和vue2获取dom元素的方法
2018/03/17 Javascript
vue 巧用过渡效果(小结)
2018/09/22 Javascript
JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】
2018/12/19 Javascript
Vue中遍历数组的新方法实例详解
2019/07/21 Javascript
vue项目部署到nginx/tomcat服务器的实现
2019/08/26 Javascript
vue实现抖音时间转盘
2019/09/08 Javascript
vue实现element表格里表头信息提示功能(推荐)
2019/11/20 Javascript
Vue.js中的高级面试题及答案
2020/01/13 Javascript
Python实现把utf-8格式的文件转换成gbk格式的文件
2015/01/22 Python
Python基础中所出现的异常报错总结
2016/11/19 Python
python线程池threadpool实现篇
2018/04/27 Python
在django view中给form传入参数的例子
2019/07/19 Python
django中上传图片分页三级联动效果的实现代码
2019/08/30 Python
基于python爬取有道翻译过程图解
2020/03/31 Python
python实现在内存中读写str和二进制数据代码
2020/04/24 Python
python语言实现贪吃蛇游戏
2020/11/13 Python
HTML5 placeholder(空白提示)属性介绍
2013/08/07 HTML / CSS
canvas 橡皮筋式线条绘图应用方法
2019/02/13 HTML / CSS
联想新西兰官方网站:Lenovo New Zealand
2018/10/30 全球购物
电子商务个人自荐信
2013/12/12 职场文书
公司委托书格式
2014/08/01 职场文书
老公写给老婆的检讨书
2015/05/06 职场文书
焦裕禄纪念馆观后感
2015/06/09 职场文书
勤俭节约主题班会
2015/08/13 职场文书
为什么 Nginx 比 Apache 更牛逼
2021/03/31 Servers