一、    引言

在本博前面的内容都对构造方法__init__进行了介绍,也在前面章节引入了__new__方法,但老猿认为__new__方法比构造方法__init__更应该属于构造方法。这是因为在Python中,__new__方法是在实例对象创建时执行的,而构造方法__init__是实例创建后执行的。

二、    __new__方法介绍

__new__方法是Python新式类引入的,__new__通常用于控制生成一个新实例的过程。它是类级别的静态方法,是在创建实例对象前执行,如果自定义类中没有重写该方法,则Python自动调用父类的方法,当所有父类也没有重写定义该方法时,则直接调用object类的__new__方法。重写时,相关方法的语法如下:

1.    语法:

__new__(cls,*args,**kwargs)

其中:

4)    cls为创建实例对应类的类名,由Python自动传入;

5)    args为实例创建时传入的非关键字参数,打包成元组tuple给函数体调用;

6)    kwargs为实例创建时传入的关键字参数,形式为字典,键值为关键字参数的关键字,字典元素值为对应关键字参数的实参值。

2.    语法释义:

1)    __new__(cls,*args,**kwargs)的参数是与实例定义的参数相对应的,实例定义的语法如下:

实例=类名(*args,**kwargs)

则:

d)    __new__的=方法中的cls一般为实例定义时的“类名”对应类,表示要创建一个该“类名”对应类型的实例,但在某些特殊情况下,可以改成其他类,如果类改成了其他类,则创建的实例就是什么类的类型。这种场景在某些时候特别有用,本节后面再介绍;

e)    后面两个参数args、kwargs是完全复制实例定义中的两种参数,表示实例定义传入什么参数,则__new__方法是在实例定义参数的基础上增加一个“类cls”的参数,并将cls作为第一个参数。

f)    args、kwargs不是两个参数,是两种参数,其中kwargs是关键字参数,args是非关键字参数,用args、kwargs分别传递创建实例时传递的所有常规实参和关键字参数实参,因此可能是0个或多个真正的参数。*args、**kwargs这种形式的参数传递模式称为“参数收集”,具体内容请参见本博客的《第5.2节 Python的函数参数收集》内容;

2)    以上语法是自定义类重写__new__方法时必须遵守的语法,当Python准备创建实例时自动调用该方法,如果自定义类没有重写该方法,则Python默认调用该类的直接父类的__new__()方法来构造该类的实例。如果该类的父类也没有重写__new__(),那么将一直按此规矩追溯至object的__new__()方法。

Python中的__new__方法非常神奇,是类实例化时的最关键方法,比构造方法__init__还重要,本节介绍了__new__的语法及各个参数的含义,实际上只介绍了基本的语法知识。请大家好好理解,鉴于该方法太重要,涉及内容比较多,后面几节将进一步深入剖析这个神奇的方法。

老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。

欢迎大家批评指正,谢谢大家关注!

最新文章

  1. WPF 微信 MVVM 【续】修复部分用户无法获取列表
  2. neo4j关闭和开启密码访问权限
  3. 理解 virbr0 - 每天5分钟玩转 OpenStack(11)
  4. thinkphp全站静态页实现方法!
  5. Linux 命令行模式 你需要知道的那些事
  6. 基础学习day02--标识符、关键字、数据类型与运算符
  7. Samba服务器安装及配置
  8. EasyUI 关于IE使用window组件上传文件
  9. 重构第四天 : 用多态替换条件语句(if else & switch)
  10. 拓扑排序 HDU1285
  11. instance 网卡是如何被拉起来的?- 每天5分钟玩转 OpenStack(172)
  12. 网络小白之WAN与LAN的区别
  13. 关于python列表和元组的基本操作
  14. mysql 分库分表备份脚本
  15. c++ cmath头文件
  16. 10.24 正睿停课训练 Day8 AM
  17. python windows 安装jieba....
  18. mysql大纲
  19. registry-1.docker.io TimeOut 错误
  20. 构建Maven项目时常见错误

热门文章

  1. solr 文档一
  2. CEF避坑指南(一)——编译并自制浏览器
  3. Socket 套接字的系统调用
  4. APP分享多张图片到微信和朋友圈
  5. Innodb之线程独享内存
  6. Oracle 集合类型
  7. 如何将IDM中的进程设置进行备份
  8. Linux-CentOS7下安装Oracle11g
  9. docker 中的mysql启动端口号总是被占用解决
  10. kafka 数据存储和发送