《Python学习手册 第五版》 -第32章 类的高级主题
本章是在原来类基础内容之后,展开的相对高级的内容,本章有提到新式类,是对比Python2和Python3来说明的,所以我会部分跳过,摘取重点来讲解说明
本章重点内容:
1、扩展内置类型:内嵌方式、子类扩展
2、新式类扩展:slot、property
3、静态方法和类方法
4、装饰器和元类:第一部分
5、super内置函数
接下来针对每个内容展开详细说明
1、扩展内置类型:内嵌方式、子类扩展
在内置类型的基础上,有时候会根据需要来支持和处理更特异的数据结构,这个时候,可以进行内置类型的扩展,可以通过内嵌、子类扩展两种方式进行
通过内嵌方式扩展类型
此处用list这个内置类型,来展示通过内嵌list的一些基本操作来实现新的操作,具体代码示例如下:
以上代码是创建了一个类,把列表的功能嵌入进去,然后实现列表不同的操作,我们通过创建实例,可以看下运行的效果
可以实现,我们想要的一些列表的基本操作,这就是通过内嵌的方式来扩展类型
通过子类扩展类型
list是叉棍见列表的方式,也是内置的列表类,是可以通过继承创建子类的,通过创建的子类,结合运算符重载的方式,可以实现子类的扩展,具体代码示例如下:
以上就是通过子类继承list,然后根据自己的需要扩展子类的运作
2、新式类扩展:slot、property
这里所说的新式类,就是Python3及之后版本中,创建的类,是相对比Python2说的
slot
通过将一系列的字符串属性名称顺序赋值给特殊的__slots__类属性,可以让类限制其实例将会得到的合法属性集,简单的说就是“管控”
通过一下代码示例你就会明白,如果为了避免非必要的属性创建,可以通过slot实现
通过上述代码的运行,你会发现,slots限制了你能使用的属性,如果你赋值了不在范围内的属性,系统会报错,提示说没有该属性,
property
property是一种让类递归自动调用方法来访问或者赋值实例属性的方法,简单来说property定义了使用属性的方法,
它有四个参数:获取、设置、删除、文档字符串,如果参数以None传入,就表示不支持对应的操作
通过四个参数我们发现,其实property与__getattr__和__setattr__重载方式有一定的重合,但是它有自己本身的优势在,我们通过代码来了解property
我们先看一个通过运算符重载来访问属性的代码
以上代码就是之前章节中讲过的,通过运算符重载来拦截对属性的访问,创建实例运行如下:
通过代码运行可以看到,可以访问age属性,但是其他属性会提示错误
和上面同样功能的展示,可以通过property实现,具体代码如下:
以上就是property的代码,第一眼的反应就是,相对上面的代码,精简了很多,其实在运行方面也有加快,通过创建实例来调用代码看下:
上面说过,property是有四个参数的,所以第一个参数是访问属性,第二个参数是设置属性,就以上面的代码为例,如果你给age赋值,系统也是会提示错误的,为什么?因为property第二个参数是None,代码运行如下:
如果想要能赋值age,可以修改源代码,修改如下:
对于修改后的代码,运行实例赋值如下:
仔细看上面代码的运行,你会发现,其实赋值的操作是赋值给了_age属性,所以要查看的话,需要通过x._age
其实除了上面介绍的扩展外,还有__getattribute__等这种,因为也相对高级,后面会介绍到,本章不再展开说明
3、静态方法和类方法
前面章节讲解类的时候你会发现,如果使用类中的方法,就需要先创建实例,通过实例来调用方法,但是有些时候,我们想直接使用类的方法,不用创建实例,这个时候就可以使用静态方法和类方法
静态方法:不传入额外的对象,通过内置函数staticmethod实现
类方法:传入一个类对象,通过内置函数classmethod实现
用静态方法计数实例,具体代码如下:
可以通过类,直接调用类的静态方法
用类方法计数实例,具体代码如下:
两者对比,你会发现,其实有很多相似之处的,也有不同的地方,画红色底线的,你会发现有不同
两者其实运作的方式是不一样的,静态方法通过类直接调用,所以不需要传递参数,类方法需要通过传递一个类来实现,所以两者的方法定义是有不同的
4、装饰器和元类:第一部分
此处之所以说是第一部分,是一个基础的说明,后面会有单独的一个大章节分别介绍装饰器和元类
装饰器可以分两种:函数装饰器、类装饰器
函数装饰器:从语法上讲,可以被看做是它后面跟着的函数的运行时说明,使用比较简单,单独一行,开始用“@”
我们用上面我们用过的静态方法的代码实例说明,除了上面的定义方式外,其实可以通过函数装饰器的方式实现,代码修改如下:
运行的方式,其实和之前的一样的,所以你也会发现,同样的一种结果,有很多不同的实现方式,这就是编程的乐趣所在
类装饰器:类似于函数装饰器,但它们是在一条class语句的末尾运行,并把一个类名重新绑定到一个可调用对象,一个简单的代码,可以更形象的理解,如下:
定义了一个简单的函数,然后通过装饰器,在类前面说明,使得类在最后也会运行该函数,运行代码如下:
元类是一种基于类的高级工具,用途与类装饰器有很多重合,在此不做展开,后面会有单独一章讲解元类
5、super内置函数
在前面的章节中有提到过super函数,它主要是在继承子类中运用到,就是子类中来调用父类的方法,一个简单示例如下:
它的优点就是减少代码的修改,如果父类有更新,使用super的就不用再调整,它是自动对接到父类的
super的使用中会有很多问题,除了这些优点外也有自己本身的局限,全面的了解可以自行百度,在此只是简单的说明基础的运用
以上就是本章的重点内容说明,下章见!
《Python学习手册 第五版》 每章时间规划及完成进度:
2019.11.25-2019.12.01 第01章,已完成:《Python学习手册 第五版》 -第1章 问答环节
2019.12.02-2019.12.08 第02章,已完成:《Python学习手册 第五版》 -第2章 Python如何运行程序
2019.12.09-2019.12.15 第03章,已完成:《Python学习手册 第五版》 -第3章 你应如何运行Python程序
2019.12.16-2019.12.22 第04章,已完成:《Python学习手册 第五版》 -第4章 介绍Python对象类型
2019.12.23-2019.12.29 第05章,已完成:《Python学习手册 第五版》 -第5章 数值类型
2019.12.30-2020.01.05 第06章,已完成:《Python学习手册 第五版》 -第6章 动态类型
2020.01.06-2020.01.12 第07章,已完成:《Python学习手册 第五版》 -第7章 字符串基础
2020.01.12-2020.01.19 第08章,已完成:《Python学习手册 第五版》 -第8章 列表与字典
2020.01.20-2020.01.26 第09章,已完成:《Python学习手册 第五版》 -第9章 元组、文件与其他核心类型
2020.01.27-2020.02.02 第10章,已完成:《Python学习手册 第五版》 -第10章 Python语句简介
2020.02.03-2020.02.09 第11章,已完成:《Python学习手册 第五版》 -第11章 赋值、表达式和打印
2020.02.10-2020.02.16 第12章,已完成:《Python学习手册 第五版》 -第12章 if测试和语法规则
2020.02.17-2020.02.23 第13章,已完成:《Python学习手册 第五版》 -第13章 while循环和for循环
2020.02.24-2020.03.01 第14章,已完成:《Python学习手册 第五版》 -第14章 迭代和推导
2020.03.02-2020.03.08 第15章,已完成:《Python学习手册 第五版》 -第15章 文档
2020.03.09-2020.03.15 第16章,已完成:《Python学习手册 第五版》 -第16章 函数基础
2020.03.16-2020.03.22 第17章,已完成:《Python学习手册 第五版》 -第17章 作用域
2020.03.23-2020.03.29 第18章,已完成:《Python学习手册 第五版》 -第18章 参数
2020.03.30-2020.04.05 第19章,已完成:《Python学习手册 第五版》 -第19章 函数的高级话题
2020.04.06-2020.04.12 第20章,已完成:《Python学习手册 第五版》 -第20章 推导和生成
2020.04.13-2020.04.19 第21章,已完成:《Python学习手册 第五版》 -第21章 基准测试
2020.04.20-2020.04.26 第22章,已完成 :《Python学习手册 第五版》 -第22章 模块:宏伟蓝图
2020.04.27-2020.05.03 第23章,已完成:《Python学习手册 第五版》 -第23章 模块代码编写基础
2020.05.04-2020.05.10 第24章,已完成:《Python学习手册 第五版》 -第24章 模块包
2020.05.11-2020.05.17 第25章,已完成:《Python学习手册 第五版》 -第25章 高级模块话题
2020.05.18-2020.05.24 第26章,已完成:《Python学习手册 第五版》 -第26章 OOP:宏伟蓝图
2020.05.25-2020.05.31 第27章,已完成:《Python学习手册 第五版》 -第27章 类代码编写基础
2020.06.01-2020.06.07 第28章,已完成:《Python学习手册 第五版》 -第28章 一个更加实际的示例
2020.06.08-2020.06.14 第29章,已完成:《Python学习手册 第五版》 -第29章 类代码编写细节
2020.06.15-2020.06.21 第30章,已完成:《Python学习手册 第五版》 -第30章 运算符重载
2020.06.22-2020.06.28 第31章,已完成:《Python学习手册 第五版》 -第31章 类的设计
2020.06.29-2020.07.05 第32章,已完成
2020.07.06-2020.07.12 第33章,未完成
2020.07.13-2020.07.19 第34章,未完成
2020.07.20-2020.07.26 第35章,未完成
2020.07.27-2020.08.02 第36章,未完成
2020.08.03-2020.08.09 第37章,未完成
2020.08.10-2020.08.16 第38章,未完成
2020.08.17-2020.08.23 第39章,未完成
2020.08.24-2020.08.30 第40章,未完成
2020.08.31-2020.09.06 第41章,未完成
以下链接,可以供你了解这个学习笔记的所有章节最新进度