【python】详解类class类的构造函数__new__和初始化函数__init__及定制一个类(终章)

首先回顾之前类的所有篇章:

  • 【python】python中的类,对象,方法,属性初认识(一)详见链接
  • 【python】详解类class的属性:类数据属性、实例数据属性、特殊的类属性、属性隐藏(二)详见链接
  • 【python】详解类class的方法:实例方法、类方法、静态方法(三)详见链接
  • 【python】详解类class的访问控制:单下划线与双下划线_(四)详见链接
  • 【python】详解类class的继承、_ _ init_ _初始化、super方法(五)详见链接
  • 【python】详解类class的方法解析顺序MRO(Method Resolution Order)(六)详见链接
  • 【python】详解类class的通过_ _slots_ _限制类实例对象的属性(七)详见链接

从基本认识类,到深入认知类的属性、方法、访问控制、继承、限制等,最终完成一篇类的完整构造,如何去构建一个类。

1、类构造和初始化
我们定义一个类,并生成初始化_ _ init _ _ 对象函数和 _ _ new _ _对象函数:

输出结果:

从结果可以看出,当实例化A类时,”_ _new _ _ “方法首先被调用,然后是” _ _ init _ _”方法。

一般来说,”_ _ init _ _ “和” _ _ new_ _”函数都会有下面的形式:

对于”_ _new _ _ “和” _ _ init _ _”可以概括为:

  • _ _new _ _ “方法在Python中是真正的构造方法(创建并返回实例),通过这个方法可以产生一个”cls”对应的实例对象,所以说” _ _ new _ _”方法一定要有返回
  • 对于”_ _ init _ _ “方法,是一个初始化的方法,“self”代表由类产生出来的实例对象,” _ _ init _ _”将对这个对象进行相应的初始化操作

前面文章中已经介绍过了”_ _ init _ _ “的一些行为,包括继承情况中” _ _ init _ _ “的表现。托福阅读算分下面就重点看看”_ _ new _ _”方法。

2、_ _ new_ _特性
“_ _ new_ _”是在新式类中新出现的方法,它有以下行为特性:

  • “_ _ new_ _” 方法是在类实例化对象时第一个调用的方法,将返回实例对象
  • “_ _ new_ _” 方法始终都是类方法(即第一个参数为cls),即使没有被加上装饰器
  • 第一个参数cls是当前正在实例化的类,如果要得到当前类的实例,应当在当前类中的 “_ _ new _ _ ” 方法语句中调用当前类的父类的” _ _ new_ _” 方法

对于上面的第三点,如果当前类是直接继承自 object,那当前类的 “_new_” 方法返回的对象应该为:

2.1、重写_ _ new_ _

如果(新式)类中没有重写”_ _ new _ _ “方法,Python默认是调用该类的直接父类的” _ _ new_ _ “方法来构造该类的实例,如果该类的父类也没有重写” _ _ new _ _ “,那么将一直按照同样的规则追溯至object的” _ _new_ _”方法,因为object是所有新式类的基类

而如果新式类中重写了”_ _new_ _ “方法,那么可以选择任意一个其他的新式类(必须是新式类,只有新式类有”_ _ new_ _ “,因为所有新式类都是从object派生)的”__ _ new _ _”方法来创建实例,包括这个新式类的所有前代类和后代类,只要它们不会造成递归死循环。

输出结果:

2.2 、_ _ init_ _的调用
“_ _ new _ _ “决定是否要使用该类的” _ _ init_ _ “方法,因为”_ _ new _ _” 可以调用其他类的构造方法或者直接返回别的类创建的对象来作为本类的实例。

通常来说,新式类开始实例化时,”_ _ new _ _ “方法会返回cls(cls指代当前类)的实例,出国英语学习然后调用该类的”_ _ init_ _ “方法作为初始化方法,该方法接收这个实例(即self)作为自己的第一个参数,然后依次传入” _ _new _ _”方法中接收的位置参数和命名参数。

但是,如果”_ _ new _ _ “没有返回cls(即当前类)的实例,那么当前类的” _ _ init_ _”方法是不会被调用的。看下面的例子:

输出结果:

2.3、派生不可变类型

  • 关于”_ _ new_ _”方法还有一个重要的用途就是用来派生不可变类型。

例如,Python中float是不可变类型,如果想要从float中派生一个子类,就要实现”_ _ new _ _”方法:

3、定制一个类

  • 在Python中,我们可以通过”魔术方法”使自定义的class变得强大、易用

调用魔术方法详细列表:
这里写图片描述

文中介绍了类的构造和初始化方法:”_ _ new _ _”和” _ _ init _ _ “。” _ _ new _ _ “方法是新式类特有的方法,通常情况下, _ _ new _ _ 方法会创建返回cls(cls指代当前类)的实例,然后调用该类的” _ _ init _ _ “方法作为初始化方法,该方法接收这个实例(即self)作为自己的第一个参数,然后依次传入” _ _ new _ _ “方法中接收的位置参数和命名参数;但是,如果” _ _ new _ _ “没有返回cls(即当前类)的实例,那么当前类的” _ _ init _ _”方法是不会被调用的。

posted @ 2018-11-28 14:27  赵莉  阅读(889)  评论(0编辑  收藏  举报
友情链接:回力鞋 | 中老年服装 | 新航道雅思 | 雅思培训机构 | SAT培训 | www.chat845.com