一、__new__方法
特点:
1.静态方法
2.创建对象/实例,并且至少需要传递一个参数cls,此参数在实例化时由python解释器自动提供
3.必须要有返回值,返回创建的实例对象
在自己实现__new__()时需要注意:
1.可以return父类(通过super(当前类名,cls)).__new__出来的实例;此方法保证是当前类实例
2.直接使用object的__new__出来的实例
注意:
若__new__() 创建的是当前类的实例,会自动调用__init__()函数
class AA(object):
pass
aa = AA()
print(aa) #<__main__.AA object at 0x0000026C09FC65F8>
_________________
class BB():
def __new__(cls, *args, **kwargs):
return super(BB,cls).__new__(cls)
bb = BB()
print(bb) #<__main__.BB object at 0x0000024E0ACCDAC8>
二、__init__方法
特点:
1.实例方法
2.初始化对象/实例,至少有一个参数self,就是这个__new__()返回的对象/实例
3.在__new__基础上执行,并不需要有返回值
class AA(): #object
def __new__(cls):
print('执行new 创建对象 分配内存')
def __init__(self):
print('执行init 初始化对象')
aa = AA()
# 执行new 创建对象 分配内存
————————————————————————————————————————
class AA(): #object
def __new__(cls, *args, **kwargs):
print('执行new 创建对象 分配内存')
return super(AA,cls).__new__(cls)
def __init__(self):
print('执行init 初始化对象')
aa = AA()
# 执行new 创建对象 分配内存
# 执行init 初始化对象
总结:
(1):用法不同
__new__方法是 分配内存 创建对象/实例,是在创建对象/实例之前被调用
__init__方法是 初始化对象/实例,是在创建对象/实例之后被调用,用于设置对象属性的初始值
可得__new__()在__init__() 之前被调用。
若__new__() 创建的是当前类的实例,会自动调用__init__()函数,通过return调用的__new__()的参数cls来保证是当前类实例。
如果是其他类的类名,那么创建返回的是其他类实例,就不会调用当前类的__init__()函数。
(2):传入参数不同
__new__(),至少有一个参数cls,表示当前类,此参数在实例化时由Python解释器自动识别
__init__(),至少有一个参数self,是有__new__()返回的创建对象/实例
(3):返回值不同
__new__(),必须有返回值,返回实例对象
__init__(),不需要返回值。
扩展:通过__new__()方法实现单例
class ShoppingCar():
def __new__(cls, *args, **kwargs):
if not hasattr(cls, "_instance"):
cls._instance = super(ShoppingCar,cls).__new__(cls)
return cls._instance
z = ShoppingCar()
x = ShoppingCar()
c = ShoppingCar()
print(z) #<__main__.ShoppingCar object at 0x0000015C21BB66A0>
print(x) #<__main__.ShoppingCar object at 0x0000015C21BB66A0>
print(c) #<__main__.ShoppingCar object at 0x0000015C21BB66A0>