__init__ 和__new__区别

_ init _的用法

class Person(object):
     def __init__(self,name,age):
            print('__init__')
            self.name = name
            self.age = age
p  = Person('laowang',33)
print(p)

输出结果:

__init__
<__main__.Person object at 0x7fb2e0936450>       
实际上,_ init_函数并不是真正意义上的构造函数,init方法的作用是在对象创建好之后初始化变量,真正创建实例的是_ new_ 方法。

_ new_的用法

class Person(object):
    def __new__(cls,name,age):
        print('__new__用法')
        instance = object.__new__(cls)
        return instance

    def __init__(self,name,age):
        print('__init__用法')
        self.name =name
        self.age = age

p  = Person('laowang',33)
print(p.name)
print(p.age)

输出结果:

__new__用法
__init__用法
laowang
33

用_ new_实现单例模式

class Person(object):
    __instance = None
    __init_flag  = False
    def __new__(cls):
        if cls.__instance == None:
              cls.__instance = object.__new__(cls)
              return cls.__instance
        else:
              return cls.__instance
    
    def __init__(self,name,age):
       if  Persom.__init_flag == False:
              self.name =name
              self.age  = age
              Person.__init_flag = True
p1 = Person('laowang',33)
p2 = Person('laozhang',30)
print(p1.name)
print(p2.name)
print(id(p1))
print(id(p2))

输出结果:

laowang
laowang
139736432307000
139736432307000
  • 可以看到p1 和 p2 都指向同一个对象,实现了单例模式
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,872评论 18 399
  • Scala与Java的关系 Scala与Java的关系是非常紧密的!! 因为Scala是基于Java虚拟机,也就是...
    灯火gg阅读 3,536评论 1 24
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,269评论 0 13
  • 主题分享(职业规划师赵凌): 1、 什么是生涯规划: 生涯规划,英文里是Career,意味着一条路可以带你...
    粉红雪人阅读 199评论 0 1
  • 作者:户慧丽 关键词:王虫,孢子,毁掉的村庄,毒森林,犹巴老师,腐海,风车村,公主娜乌西卡 影评:影片开头用犹巴的...
    小小故事大智慧阅读 3,601评论 0 1