python__new__类方法,Python __new__

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: