zoukankan      html  css  js  c++  java
  • python __new__()分析

    我们来看下下面类中对__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() 

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

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

    __init__()有一个参数self,该self参数就是__new__()返回的实例,__init__()在__new__()的基础上可以完成一些其它初始化的动作,__init__()不需要返回值。

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

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

    下面来个单例模式,通过重载__new__实现单例

    class Singleton(object):
        def __new__(cls, *args, **kwargs):
            if not hasattr(cls, '_instance'):
                cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
            return cls._instanc
  • 相关阅读:
    Flexbox 可视化属性
    latex 数学公式
    迭代器模式 rx 应用
    小程序开发 easy-less 配置
    react-devtool 消息处理渲染 源码理解
    csrf jsonp
    koa1 源码详解1
    Immutable api example
    es6 ajax
    lodash 替换 underscore
  • 原文地址:https://www.cnblogs.com/lfxiao/p/9303537.html
Copyright © 2011-2022 走看看