详解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实现拉钩网上的FizzBuzzWhizz问题示例
May 05 Python
Tornado Web服务器多进程启动的2个方法
Aug 04 Python
Python之PyUnit单元测试实例
Oct 11 Python
Python 循环语句之 while,for语句详解
Apr 23 Python
使用Python 统计高频字数的方法
Jan 31 Python
python生成随机红包的实例写法
Sep 02 Python
使用Python代码实现Linux中的ls遍历目录命令的实例代码
Sep 07 Python
基于梯度爆炸的解决方法:clip gradient
Feb 04 Python
Python异常继承关系和自定义异常实现代码实例
Feb 20 Python
Python虚拟环境venv用法详解
May 25 Python
Pycharm2020.1安装中文语言插件的详细教程(不需要汉化)
Aug 07 Python
Django框架中模型的用法
Jun 10 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/02/05 PHP
php将图片保存入mysql数据库失败的解决方法
2014/12/27 PHP
php解析http获取的json字符串变量总是空白null
2015/03/02 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
2015/10/22 PHP
thinkPHP框架实现的无限回复评论功能示例
2018/06/09 PHP
微信公众号之主动给用户发送消息功能
2019/06/22 PHP
基于Jquery的跨域传输数据(JSONP)
2011/03/10 Javascript
js禁止document element对象选中文本实现代码
2013/03/21 Javascript
javascript实现动态侧边栏代码
2014/02/19 Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
2014/12/18 Javascript
JS+CSS实现可拖拽的漂亮圆角特效弹出层完整实例
2015/02/13 Javascript
jQuery头像裁剪工具jcrop用法实例(附演示与demo源码下载)
2016/01/22 Javascript
jQuery获取父元素及父节点的方法小结
2016/04/14 Javascript
基于jquery实现ajax无刷新评论
2020/08/19 Javascript
jQuery 点击获取验证码按钮及倒计时功能
2018/09/20 jQuery
JS开发自己的类库实例分析
2019/08/28 Javascript
vue请求数据的三种方式
2020/03/04 Javascript
[54:28]EG vs OG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
在Django的通用视图中处理Context的方法
2015/07/21 Python
使用python实现接口的方法
2017/07/07 Python
基于Python List的赋值方法
2018/06/23 Python
python gensim使用word2vec词向量处理中文语料的方法
2019/07/05 Python
django数据模型中null和blank的区别说明
2020/09/02 Python
Python加载数据的5种不同方式(收藏)
2020/11/13 Python
韩都衣舍天猫官方旗舰店:天猫女装销售总冠军
2017/10/10 全球购物
美国迪克体育用品商店:DICK’S Sporting Goods
2018/07/24 全球购物
大学生饮食配送创业计划书
2014/01/04 职场文书
实习老师离校感言
2014/02/03 职场文书
自立自强的名人事例
2014/02/10 职场文书
员工合理化建议书
2014/05/19 职场文书
2014副局长群众路线对照检查材料思想汇报
2014/09/22 职场文书
2015年秋季小学开学标语
2015/07/16 职场文书
暑期社会实践新闻稿
2015/07/17 职场文书
浅谈由position属性引申的css进阶讨论
2021/05/25 HTML / CSS
在 Python 中利用 Pool 进行多线程
2022/04/24 Python
MySQL 字符集 character
2022/05/04 MySQL