Python——__new__()、__init__()区别 (个人向)

一、__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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值