详解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 smtplib发送带附件邮件小程序
May 22 Python
flask-restful使用总结
Dec 04 Python
selenium+python自动化测试环境搭建步骤
Jun 03 Python
python numpy中cumsum的用法详解
Oct 17 Python
Python实现图片批量加入水印代码实例
Nov 30 Python
Python写出新冠状病毒确诊人数地图的方法
Feb 12 Python
通过python连接Linux命令行代码实例
Feb 18 Python
深入浅析Python 命令行模块 Click
Mar 11 Python
python实点云分割k-means(sklearn)详解
May 28 Python
解决tensorflow 释放图,删除变量问题
Jun 23 Python
基于python调用jenkins-cli实现快速发布
Aug 14 Python
python 基于Apscheduler实现定时任务
Dec 15 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中date()日期函数有关参数整理
2011/07/19 PHP
destoon实现调用热门关键字的方法
2014/07/15 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
2016/02/16 PHP
Centos7 Yum安装PHP7.2流程教程详解
2019/07/02 PHP
宝塔面板在NGINX环境中TP5.1如何运行?
2021/03/09 PHP
msn上的tab功能Firefox对childNodes处理的一个BUG
2008/01/21 Javascript
jquery 查找新建元素代码
2010/07/06 Javascript
js跑步算法的实现代码
2013/12/04 Javascript
jquery实现倒计时代码分享
2014/06/13 Javascript
JS显示日历和天气的方法
2016/03/01 Javascript
JS中如何比较两个Json对象是否相等实例代码
2016/07/13 Javascript
jQuery给指定的table动态添加删除行的操作方法
2016/10/12 Javascript
JavaScript 自定义事件之我见
2017/09/25 Javascript
javaScript中&quot;==&quot;和&quot;===&quot;的区别详解
2018/03/16 Javascript
使用json-server简单完成CRUD模拟后台数据的方法
2018/07/12 Javascript
angular 未登录状态拦截路由跳转的方法
2018/10/09 Javascript
vue多次循环操作示例
2019/02/08 Javascript
JS实现横向跑马灯效果代码
2020/04/20 Javascript
微信小程序实现拼图小游戏
2020/10/22 Javascript
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
2020/12/15 Vue.js
python魔法方法-属性转换和类的表示详解
2016/07/22 Python
使用python将请求的requests headers参数格式化方法
2019/01/02 Python
对python3中, print横向输出的方法详解
2019/01/28 Python
python 进程 进程池 进程间通信实现解析
2019/08/23 Python
Python 中的 import 机制之实现远程导入模块
2019/10/29 Python
python实现飞机大战游戏(pygame版)
2020/10/26 Python
python实现批量修改文件名
2020/03/23 Python
Python如何输出警告信息
2020/07/30 Python
移动端rem布局的两种实现方法
2018/01/03 HTML / CSS
英国电气世界:Electrical World
2019/09/08 全球购物
测绘工程系学生的自我评价
2013/11/30 职场文书
歌颂党的演讲稿
2014/09/10 职场文书
高中生逃课检讨书
2014/10/10 职场文书
建筑工地资料员岗位职责
2015/04/13 职场文书
90条交通安全宣传标语
2019/10/12 职场文书
xhunter1.sys可以删除嘛? win11提示xhunter1.sys驱动不兼容解决办法
2022/09/23 数码科技