第8.4节 Python类中不是构造方法却胜似构造方法的__new方法__深入剖析:语法释义
一、 引言
在本博前面的内容都对构造方法__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的世界。
欢迎大家批评指正,谢谢大家关注!
第8.4节 Python类中不是构造方法却胜似构造方法的__new方法__深入剖析:语法释义的更多相关文章
- 第7.17节 Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析
第7.17节 Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析 静态方法也是通过类定义的一种方法,一般将不需要访问类属性但是类需要具有的一些能力可以静态方法提供. 一 ...
- 第7.14节 Python类中的实例方法详析
第7.14节 Python类中的实例方法详析 一. 实例方法的定义 在本章前面章节已经介绍了类的实例方法,实例方法的定义有三种方式: 1. 类体中定义实例方法 第一种方式很简单,就是在类体 ...
- 第8.6节 Python类中的__new__方法深入剖析:调用父类__new__方法参数的困惑
上节<第8.5节 Python类中的__new__方法和构造方法__init__关系深入剖析:执行顺序及参数关系案例详解>通过案例详细分析了两个方法的执行顺序,不知大家是否注意到了,在上述 ...
- 第8.12节 Python类中使用__dict__定义实例变量和方法
上节介绍了使用实例的__dict__查看实例的自定义属性,其实还可以直接使用__dict__定义实例变量和实例方法. 一. 使用__dict__定义实例变量 语法: 对象名. dict[属性名] = ...
- 第8.9节 Python类中内置的查看直接父类的__bases__属性
终于介绍完了__init__方法和__new__方法,接下来轻松一下,本节介绍类中内置的__bases__属性. 一. 语法释义 Python 为所有类都提供了一个 bases 属性,通过该属性可以查 ...
- 第8.11节 Python类中记录实例变量属性的特殊变量__dict__
一. 语法释义 调用方法:实例. __dict__属性 __dict__属性返回的是实例对象中当前已经定义的所有自定义实例变量的名和值,用字典存储,每个元素为一个"实例变量名:值" ...
- 第8.14节 Python类中内置方法__str__详解
一. object类内置方法__str__和函数str 类的内置方法__str__和内置函数str实际上实现的是同一功能,实际上str调用的就是__str__方法,只是调用方式不同,二者的调用语法如下 ...
- 第7.10节 Python类中的实例变量定义与使用
一. 引言 在前面章节已经引入介绍了类变量和实例变量,类体中定义的变量为类变量,默认属于类本身,实例变量是实例方法中定义的self对象的变量,对于每个实例都是独有数据,而类变量是该类所有实例共享 ...
- 第8.5节 Python类中的__new__方法和构造方法__init__关系深入剖析:执行顺序及参数关系案例详解
上节介绍了__new__()方法这个比构造方法还重要的方法的语法,本节通过案例来详细剖析__new__()方法的细节以及它与构造方法之间的关系. 一. 案例说明 本节以圆Cir类为例来说明,为了 ...
随机推荐
- Spring Cloud 纯干货,从入门到实战
导读 之前写过一篇SpringCloud从入门到精通的点我直达,微服务基础知识点我直达,今天我们使用Spring Cloud模拟一个电商项目.分别有以下2个服务,商品.订单.下面我们开始叭 技术栈 S ...
- Thinkphp3.2 cms之权限管理
五.权限管理 <?php namespace Admin\Controller; use Think\Controller; class CommonController extends Con ...
- 文科妹子都会用 GitHub,你这个工科生还等什么
在某乎上刷到一条关于 GitHub 的留言,如下: 点赞人数还不少,这说明还真有不少工科生不会用 GitHub,你看大小写都没有区分(手动狗头).所以我就想写篇文章科普下,"新手如何使用 G ...
- 交换机基于接口划分VLAN(汇聚层设备作为网关)
组网图形 简介 划分VLAN的方式有:基于接口.基于MAC地址.基于IP子网.基于协议.基于策略(MAC地址.IP地址.接口).其中基于接口划分VLAN,是最简单,最常见的划分方式,如接入层设备作为网 ...
- 最全总结 | 聊聊 Python 办公自动化之 Excel(下)
1. 前言 前面谈到 Python 处理 Excel 文件最常见的两种方式,即:xlrd/xlwt.openpyxl 其中, xlrd/xlwt 这一组合,xlrd 可以负责读取数据,而 xlwt ...
- python_计算器
import re from functools import reduce # 定义一个只计算两个数的乘法或除法的函数: def multiply_division(exp): if "* ...
- [MIT6.006] 21. Daynamic Programming III: Parenthesization, Edit Distance, Knapsack 动态规划III:括号问题,编辑距离,背包问题
这节课主要针对字符串/序列上的问题,了解如果使用动态规划进行求解.上节课我们也讲过使用前缀和后缀的概念,他们如下所示: 接下来,我们通过三个问题来深入了解下动态规划使用前缀.后缀和子串怎么去解决括号问 ...
- Angular 之装饰器@Input
Input 一个装饰器,用来把某个类字段标记为输入属性,并提供配置元数据. 该输入属性会绑定到模板中的某个 DOM 属性.当变更检测时,Angular 会自动使用这个 DOM 属性的值来更新此数据属性 ...
- LeetCode283移动零问题java高效解法
一.题目: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序. 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 1.必须 ...
- Nacos配置中心源码分析
1.使用 compile 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config:2.2.3.RELEASE' spring: app ...