new和单例模式

new

new()方法是构造方法,init()方法是初始化方法,new()在init()之前执行,由new()创建一个对象,供init()初始化。

new()才是真正的实例化方法,为类提供外壳制造出实例框架,然后调用该框架内的构造方法init()使其丰满。

class A:
    def __init__(self):
        print('init function')
    def __new__(cls, *args, **kwargs):
        print('new function')
        return object.__new__(A)

a = A()

#先执行new()方法,再执行init()方法
out:new function
  init function

 

单例模式

下面创建的两个对象其实在同一块内存,即同一对象。

class Singleton:
    def __new__(cls, *args, **kw):
        if not hasattr(cls, '_instance'):
            cls._instance = object.__new__(cls)
        return cls._instance

one = Singleton()
two = Singleton()

two.a = 3
print(one.a)
# 3
# one和two完全相同,可以用id(), ==, is检测
print(id(one))
# 29097904
print(id(two))
# 29097904
print(one == two)
# True
print(one is two)

 

posted @ 2019-08-18 11:06  tianqibucuo  阅读(905)  评论(0编辑  收藏  举报