当前位置: 首页 > 图灵资讯 > 行业资讯> Python中的__new__()方法的使用

Python中的__new__()方法的使用

来源:图灵python
时间: 2025-02-05 20:48:36

使用方法:1、在__new__()方法中至少需要传输一个参数cls;2、__new__()必须有返回值,返回实例化的例子。

Python___new__()使用方法

__new__() 函数只能用于从object继承的新类别。

首先,看看object类中的___new__()方法的定义:

classobject:
@staticmethod#knowncaseof__new__
def__new__(cls,*more):#knownspecialcaseofobject.__new__
"""T.__new__(S,...)->anewobjectwithtypeS,asubtypeofT"""
pass

object__new__()方法定义为静态方法,至少需要传输一个参数cls,即Python解释器在实例化时自动提供的实例类。

下面我们来看看下面的类中对__new__()方法的实现:

classDemo(object):
def__init__(self):
print'__init__()called...'

def__new__(cls,*args,**kwargs):
print'__new__()-{cls}'.format(cls=cls)
returnobject.__new__(cls,*args,**kwargs)

if__name__='__main__':
de=Demo()

输出:

当发现实例对象时,调用__init__()初始化前,先调用__new__()方法

__new__()必须有返回值和返回实例化的实例。需要注意的是,可以return父类__new__()实例,也可直接将object____new__()出来的例子返回。

__init__()有一个参数self,这个self参数是__new__()返回实例,___init___()在___new__()其他一些初始化动作可以在此基础上完成,___init__()不需要返回值。

若__new__()没有正确返回当前类cls的例子,那么__init__()即使是父类的例子也不会被调用。

我们可以将类比作制造商,__new__()方法是前期原材料采购环节,__init__()方法是在原材料的基础上加工和初始化商品环节。

在实际应用过程中,我们可以这样使用:

classLxmlDocument(object_ref):
cache=weakref.WeakKeyDictionary()
__slots__=['__weakref__']

def__new__(cls,response,parser=etree.HTMLParser):
cache=cls.cache.setdefault(response,{})
ifparsernotincache:
obj=object_ref.__new__(cls)
cache[parser]=_factory(response,parser)
returncache[parser]

这类_____new__()方法的使用是在初始化之前检查缓存中是否存在对象。如果存在,将缓存对象直接返回。如果没有,将对象放入缓存中供下次使用。

再来一个单例,通过重载___new__实现单例:

classSingleton(object):
def__new__(cls,*args,**kwargs):
ifnothasattr(cls,'_instance'):
cls._instance=super(Singleton,cls).__new__(cls,*args,**kwargs)
returncls._instanc

推荐课程:Python入门及高级教学视频(极客学院)