前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python 魔法方法连载四 __new__()

python 魔法方法连载四 __new__()

作者头像
周辰晨
发布2020-04-14 16:23:10
3550
发布2020-04-14 16:23:10
举报

前言

在学习__new__(cls,[ *args]) 方法之前,我们知道,当实例化一个对象时,首先调用的是 __init__()方法初始化对象,但在我们学习了了__new__()魔法方法后,就会发现我们这种认知是错误的。

__new__(cls,[ *args])

__new__ 是实例化对象调用的第一个方法(不是__init__方法)•它的第一个参数是这个类(cls),其他参数直接传递给__init__方法.•__new__方法返回一个实例对象,如果没有返回实例对象,则__init__方法不会调用. 绝大多部分情况下,我们不需要重载__new__方法,但当继承一个不可变的类如strint类等,我们可以通过__new__方法来自定这些类的实例化过程。 如一个类继承str:

代码语言:javascript
复制
>>> class str_cls(str):
...     def __init__(self,string):
...             self = string
...
>>> a = str_cls('aaa')
>>> print(a)
aaa

self = string 表示实例初始化对象时,这个对象所指向的就是传入的参数。那现在想实现把实例对象时的入参变成大写,如下所示:

代码语言:javascript
复制
>>> a = str_cls('aaa')
>>> print(a)
AAA

如果我们只通过修改__init__方法是实现不了该功能的:

代码语言:javascript
复制
...
 self = string.upper()
...

我们必须通过重载__new__方法来实现:

代码语言:javascript
复制
>>> class str_cls(str):
...     def __new__(cls,string):
...             string = string.upper()
...             return super().__new__(cls,string)
...
>>> a = str_cls('aaa')
>>> print(a)
AAA

对于这些不可变的对象,我们只有通过__new__方法处理,才能得到我们想要的结果。 __new____init_ 相配合,才是真正的类构造器。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构师影响力 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • __new__(cls,[ *args])
相关产品与服务
日志服务
日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档