1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
""" 每创建一个对象,就会在内存中多占用一份空间 为了节省空间,提升执行效率,使用单态模式 场景:只是单纯调用类中的成员,而不会额外为当前对象添加成员; """
class Singleton(): __obj = None
def __new__(cls): if cls.__obj is None: cls.__obj = object.__new__(cls) return cls.__obj
""" 第一次,在实例化对象时触发__new__魔术方法 if cls.__obj is None 条件成立 cls.__obj = object.__new__(cls) 创建一个对象给私有成员属性__obj return cls.__obj 用obj1接收到了对象
第二次,在实例化对象时触发__new__魔术方法 if cls.__obj is None不满足,因为已经在__obj属性中存放了一个对象 return cls.__obj
第三次,在实例化对象时触发__new__魔术方法 if cls.__obj is None不满足,因为已经在__obj属性中存放了一个对象 return cls.__obj """ obj1 = Singleton() obj2 = Singleton() obj3 = Singleton() print(obj1, obj2, obj3)
class Singleton(): __obj = None
def __new__(cls, *args, **kwargs): if cls.__obj is None: cls.__obj = object.__new__(cls) return cls.__obj
def __init__(self, name): self.name = name
obj1 = Singleton("康玉康") obj2 = Singleton("张保张") print(obj1, obj2) print(obj1.name) print(obj2.name) """ 康玉康 康玉康 康玉康 张保张 张保张 张保张
第一次实例化对象时, 触发__new__ if cls.__obj is None: 创建一个新的对象进行返回 然后触发__init__ self.name = 康玉康
第二次实例化对象时 触发__new__ if cls.__obj is None: 条件不满足,返回的是第一次实例化的对象,是同一个 然后触发__init__ self.name = 张保张 """
name = "康裕康" name = "张保障" print(name)
|