详解Python中的__new__()方法的使用

yipeiwu_com6年前Python基础

先看下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__()方法的使用,就是再进行初始化之前,检查缓存中是否存在该对象,如果存在则将缓存存放对象直接返回,如果不存在,则将对象放至缓存中,供下次使用。

相关文章

浅谈Pandas Series 和 Numpy array中的相同点

相同点: 可以利用中括号获取元素 s[0] 可以的得到单个元素 或 一个元素切片 s[3,7] 可以遍历 for x in s 可以调用同样的函数获取最大最小值 s.mean() &nb...

使用python实现链表操作

使用python实现链表操作

一、概念梳理 链表是计算机科学里面应用应用最广泛的数据结构之一。它是最简单的数据结构之一,同时也是比较高阶的数据结构(例如棧、环形缓冲和队列) 简单的说,一个列表就是单数据通过索引集合在...

python+pyqt5实现KFC点餐收银系统

python+pyqt5实现KFC点餐收银系统

本文实例为大家分享了python实现KFC点餐收银系统的具体代码,供大家参考,具体内容如下 这个kfc收银系统我实现了的以下功能: 1.正常餐品结算和找零。 2.基本套餐结算和找零。 3...

python实现通过flask和前端进行数据收发

python代码: # -*- coding: utf-8 -*- from flask import Flask,jsonify,render_template,request i...

分析Python中解析构建数据知识

Python 可以通过各种库去解析我们常见的数据。其中 csv 文件以纯文本形式存储表格数据,以某字符作为分隔值,通常为逗号;xml 可拓展标记语言,很像超文本标记语言 Html ,但主...