__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 都指向同一个对象,实现了单例模式

你可能感兴趣的:(__init__ 和__new__区别)