__new__
1 # __new__
2 # object.__new__()
3
4 class A :
5 def __init__(self):
6 self.x = 1
7 print("init执行啦")
8 def __new__(cls, *args, **kwargs):
9 print("new执行啦")
10 return object.__new__(A,*args,**kwargs) # __new__ 是不能自己创建对象的,因此他只能用object类中的__new__来创建一个实例化
11
12 a = A()
13 # 执行结果:
14 # new执行啦 # 先执行的是 new
15 # init执行啦
16
17 # new 是比 init 还要现执行。
18 # new的参数是cls 不是 self,
19 # init 创建self,但是new 比self 还要先执行,因此new执行的时候没有self,只有cls
20 # cls 表示上一层,即这个类本身
21 # __new__ 是不能自己创建对象的,因此他只能用object类中的__new__来创建一个实例化
设计模式 23种
单例模式 一个类始终只有一个实例
当你第一次实例化这个类的时候就创建一个实例化对象
当你之后实例化的时候就用之前的创建的对象,相当于所有的操作对象就那一个
1 class A :
2 __instance = False # 定义一个私有的变量,只能内部的去拿
3 def __init__(self,name,age):
4 self.name = name
5 self.age = age
6 def __new__(cls, *args, **kwargs):
7 if cls.__instance: # 第一次循环外部拿不到自然就是 Fales
8 return cls.__instance
9 else:cls.__instance = object.__new__(A) # 借助object类创建的实例并赋值
10 # 第一次创建的变量一定是fales的
11 # 返回一个借助object类创建的实例并赋值,
12 # 所创建的这个实例是什么都没有的,没有self的属性,只是开辟了一段空的内存地址给他用
13 # 之后在调用init 根据你的参数赋值属性添加内存
14 # __instance是保存在类里面的静态变量
15 # 以后每次进来都是使用cls.__instance 作为实例了
16 return cls.__instance # 返回一个全局的变量
17 suyang = A("sbb",2)
18 suyang.cloth = "none"
19 sb = A("suyang",2) # 在创建示例会覆盖之前的实例的属性,但是两个示例都是存在的
20 print(sb) # <__main__.A object at 0x000000000255D208>
21 print(suyang) # <__main__.A object at 0x000000000255D208>
22 print(suyang.name) # suyang
23 print(sb.name) # suyang # name 和age 都会被下一次实例化的时候被新值锁覆盖
24 print(suyang.cloth) # none # 尽管使用一个内存地址但是cloth 的属性没有被覆盖,而且保存在地址里面也不会被清除
25 print(sb.cloth) # none # sb示例并没有创建 cloth 属性,但是依然可以调用出来之前 suyang 示例的属性 ,即继承了之前的属性
26
27 sb.hobby = "sb"
28 print(suyang.hobby) # sb # 相同的没有创建 hobby 的 suyang 示例 也可以继承之后的 sb 创建的 hobby 属性