python的__new__ 和 __init__

Python__new__与__init__详解
本文通过一个Python示例,详细解析了__new__和__init__方法的执行顺序与机制,揭示了对象创建过程中这两个特殊方法的具体作用及它们在继承中的调用顺序。

昨天偶然在一篇博客中看到关于 __new__ 和 __init__ 的一道题目,发现不太理解,于是搜了一下相关资料学习一下。

然后在博客园一篇博文评论区,与一位博主讨论了很多次,

链接 : Python中__new__的作用

想要弄清楚这两个方法具体的运行顺序以及机制 ,于是就写了一个简单的测试例子:

python版本:3.7 



class PositiveInteger(int):
    def __init__(self, value):
        print('init', value)
        # 没有返回值 , 只是为了对照
        super_init = super(PositiveInteger, self).__init__()
        print('super_init', super_init)

    def __new__(cls, value):
        print('new', value)
        value += 1
        super_new = super(PositiveInteger, cls).__new__(cls, value)
        print('super_new', super_new)
        return super_new


class PositiveInteger2(PositiveInteger):
    def __init__(self, value):
        print('init2', value)
        # 没有返回值 , 只是为了对照
        super_init2 = super(PositiveInteger2, self).__init__(abs(value))
        print('super_init2', super_init2)

    def __new__(cls, value):
        print('new2', value)
        value += 1
        super_new2 = super(PositiveInteger2, cls).__new__(cls, value)
        print('super_new2', super_new2)
        return super_new2


i = PositiveInteger2(-3)
print(i)

运行结果:

new2 -3
new -2
super_new -1
super_new2 -1
init2 -3
init 3
super_init None
super_init2 None
-1

这个例子可以很清晰追踪到,两个方法的执行顺序 ,以及继承时的调用顺序。

可以得出几点结论:

1. 声明对象时 , 会分别调用 __new__() 和 __init__() 方法 ,

2. 虽然__new__()先执行 , 但两个方法的入参变量是同一个对象 , __new__()中对入参进行二次赋值 , 并不会影响__init__()方法的入参对象值

3. 由于第二点 , 所以两个方法的入参数量需保持一致

4. __new__()方法创造了对象的实例并返回,而__init__() 方法作为构造方法对成员变量(局部变量) 进行操作 , __new__() 中无法触达局部变量 ( 这点在代码中没有显示 , 可以随便添加一个局部变量 , 在__new__() 调用试试看 , 编译器会报错 )

 

果然语言是想通的 , python的这种机制 , 和java的new关键字与类构造方法的关系很相似。

 

__new____init__是Python中的两个特殊方法。 __new__方法在一个对象实例化时调用,返回一个新创建的实例对象。它是一个类级别的方法,并且在实例化之前被调用。__new__方法通常用于控制对象的创建过程,可以自定义对象的创建方式。 __init__方法在对象实例化后调用,用于初始化对象的属性。它是一个实例级别的方法,并且在__new__方法之后被调用。__init__方法用于设置对象的初始状态,可以对属性进行赋值或执行其他初始化操作。 通常情况下,我们会在__new__方法中创建对象,并在__init__方法中对对象进行初始化。但是也可以只使用其中的一个方法,根据具体需求来决定是否需要自定义对象的创建过程或初始化操作。 下面是一个示例代码,演示了__new____init__方法的使用: ```python class MyClass: def __new__(cls, *args, **kwargs): instance = super().__new__(cls) # 自定义对象创建过程 # 可以在这里进行一些额外的操作 return instance def __init__(self, *args, **kwargs): # 对象初始化操作 # 可以在这里对属性进行赋值 pass # 创建对象 obj = MyClass() ``` 在这个示例中,我们重写了MyClass类的__new__方法__init__方法。在__new__方法中,我们使用了super()来调用父类的__new__方法,获得一个新的实例对象。在__init__方法中,我们可以对对象进行初始化操作。最后,通过实例化MyClass类来创建对象obj。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值