专栏首页软件测试架构师俱乐部python 魔法方法连载四 __new__()

python 魔法方法连载四 __new__()

前言

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

__new__(cls,[ *args])

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

>>> class str_cls(str):
...     def __init__(self,string):
...             self = string
...
>>> a = str_cls('aaa')
>>> print(a)
aaa

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

>>> a = str_cls('aaa')
>>> print(a)
AAA

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

...
 self = string.upper()
...

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

>>> 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_ 相配合,才是真正的类构造器。

本文分享自微信公众号 - 软件测试架构师俱乐部(gh_03227f9a322f),作者:鲲鹏

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • __all__ 是干嘛用的?

    前两天写代码的时候在一个简单的导入操作上竟然卡了有半小时之多,弄了半天才发现问题所在,分享给大家,希望对大家有所借鉴。

    cctester
  • 混沌工程-初识

    公司新成立了一个稳定性团队,20年的重要目标之一就是开展混沌工程。为了后续更好的开展工作,记录关于“混沌工程”相关的知识以及工程实践。

    cctester
  • Nmon使用详解

    Nmon 是免费监控 AIX 系统与 Linux 系统资源的工具。该工具可将服务器系统资源耗用情况收集起来并输出一个特定的文件,并可利用 excel 分析工具(...

    cctester
  • python 中的特殊方法,纠正自己笨笨

      注: 在Python 3.x中没有新式类和老式类之分,它们都继承自'object' 类。因此可以不用显示地指定其基类。'object'基类中拥有的方法和属性...

    py3study
  • “单例模式有四样写法,你知道么?”——孔乙己

    单例模式(Singleton Pattern)是最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

    BigYoung小站
  • css3的一些属性--filter(滤镜) 属性

    wust小吴
  • 在Python中实现单例模式

    有些时候你的项目中难免需要一些全局唯一的对象,这些对象大多是一些工具性的东西,在Python中实现单例模式并不是什么难事。以下总结几种方法: 使用类装饰器 ...

    Jetpropelledsnake21
  • Python中的单例模式

    单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个...

    py3study
  • redis 存储对

    如果需要用到Redis存储List对象,而list又不需要进行操作,可以按照MC的方式进行存储,不过Jedis之类的客户端没有提供API,可以有两种思路实现: ...

    半条命专刊
  • Python实现Singleton模式的

    使用python实现设计模式中的单例模式。单例模式是一种比较常用的设计模式,其实现和使用场景判定都是相对容易的。本文将简要介绍一下python中实现单例模式的几...

    py3study

扫码关注云+社区

领取腾讯云代金券