Python类中的__new__和__init__的区别

在写Python类时,或者看某些项目源码时,总是见到__init____new__方法,一直没有深入研究两者的区别,今天聊聊这个。

__new__

__new__是类(class)方法。

class新创建实例时,会调用__new__,它主要控制一个新实例的创建。

需要知道的是,__new__是实例创建的第一步。首先调用它,再由它负责返回类的新实例。

通常,__new__除非您要继承不可变类型(如str,int,unicode或tuple),否则不必重写。

针对__new__的用法,举个栗子:

依照Python官方文档的说法,new方法主要是当你继承一些不可变的class时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径。还有就是实现自定义的metaclass。

首先我们来看一下第一个功能,具体我们可以用int来作为一个例子:假如我们需要一个永远都是正数的整数类型,通过集成 int,我们可能会写出这样的代码。

69f9bc49f19a866f75e35bc6ed8ee09e.png

但运行后会发现,结果根本不是我们想的那样,我们任然得到了-3。 这是因为对于int这种 不可变的对象,我们只有重载它的new方法才能起到自定义的作用。这是修改后的代码: 3da6c8cf37ec9e6f18512fbeb31bc712.png 通过重载new方法,我们实现了需要的功能。

__init__

__init__是实例方法。

class调用__init__时,是对这个class生成的新实例初始化,初始化的内容,就是__init__内定义的内容。

每新创建一个实例,实例都会初始化这些内容,这些内容都是初始化给新创建的实例,跟class无关。

__init__不返回任何东西。创建实例后,它仅负责初始化实例,且仅在需要初始化某些内容时,才会进行调用。

参考文档: https://stackoverflow.com/questions/674304/why-is-init-always-called-after-new https://www.cnblogs.com/shenxiaolin/p/9307496.html 本文首发于BigYoung小站

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Young文人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值