python__new__类方法,Python __new__
用法:1。至少一个参数cls需要在__new__()方法中传递;2.__new__()必须有返回值,该值返回实例化的实例。
Python中的__new__()方法的使用
__new__()函数只能用于从object继承的新类。
先看看object类中__new__()方法的定义:
类对象:
@ static method # known caseof _ _ new _ _
def__new__(cls,* more): # knownspecialcaseofobject。__新_ _
T.__new__(S,)-anewobjectwithtypeS,asubtypeofT
及格
object __new__()方法被定义为静态方法,至少需要传递一个参数cls。cls表示要实例化的类,该参数由Python解释器在实例化时自动提供。
让我们看看__new__()方法在下面的类中的实现:
classDemo(对象):
def__init__(self):
打印“__init__()”调用.
def__new__(cls,*args,**kwargs):
打印“__new__()-{cls}”。格式(cls=cls)
returnobject。__new__(cls,*args,**kwargs)
if__name__==__main__:
德=德莫()输出:
当找到实例化的对象时,在调用__init__()进行初始化之前,调用__new__()方法。
__new__()必须有返回值,该值返回实例化的实例。需要注意的是,可以直接返回父类_ _ new _()的实例或者对象_ _ new _()的实例。
__init__()有一个参数self,它是__new__()返回的实例。__init__()可以基于_ _ new _()完成一些其他的初始化动作,__init__()不需要返回值。
如果__new__()没有正确返回当前cls类的实例,那么__init__()将不会被调用,即使是父类的实例。
我们可以拿制造商来类比。__新__()法是原材料的前期采购,_ _初始化_ _()法是在原材料的基础上对商品进行加工初始化。
在实际应用中,我们可以这样使用:
classlxml document(object _ ref):
cache=weakref。WeakKeyDictionary()
__slots__=[__weakref__]
def__new__(cls,response,parser=etree。HTMLParser):
cache=cls . cache . set default(response,{})
ifparsernotincache:
obj=object_ref__新__(cls)
cache[解析器]=_factory(响应,解析器)
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入门及高级教学视频(极客学院)
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。