《Python学习手册 第五版》 -第38章 被管理的属性
就像前面提到的,从37章开始就是相对补充的高阶知识内容,本章是前面讲解的描述符等内容的扩展和深入
本章重点内容
1、Property
2、描述符
3、__getattr__和__getattribute__
接下来展开详细的说明
1、Property
property协议允许我们把一个特定属性的获取、设置和修改操作指向我们所提供的函数或方法,使得我们能够插入再属性访问时自动运行的代码,或是拦截属性的删除,并且如果愿意的话还可以为属性提供文档
接下来看一个具体的代码示例,如下:
以上示例简单的跟踪了属性的访问,除此之外还可以做其他运作,例如,当获取属性的时候,动态的计算属性的值,下面的例子展示了这一点:
前面的章节我们有提到装饰器的内容,可以使用装饰器来编写property,还是以上面的第一个示例为基础,进行改写,如下:
运行结果和第一个示例是一样的:
2、描述符
描述符编写成单独的类,并且针对想要拦截的属性访问操作提供明确指定的访问器方法,当以相应的方式访问赋值了描述符类实例的属性时,描述符类中的获取、设置和删除等方法就会自动运行
文字看起来比较抽象,可以通过具体的代码示例了解,如下:
运行结果和property是一样的
其中代码示例中,需要特别说明__get__方法的运行,该方法运行的时候传递了3个对象来定义上下文:
1)self 是 Name类的实例
2)instance是Person类实例
3)owner 是 Person类
用描述符的方法,同样可以实现属性的调用时的计算,你可以自己参考上面的代码尝试一下
3、__getattr__和__getattribute__
__getatrr__针对未定义的属性运行,因为它能只为不存储的实例中或是不继承自它的类的属性运行,所以它的用法也相对直接
__getattribute__针对所有的属性运行。因为它是涵盖一切的,所以在使用它的时候,必须小心避免通过把属性访问传递给父类而导致递归循环
看一个使用__getattr__的示例,如下:
创建实例,运行结果如下:
通过改写上面的示例,采用__getattribute__,如下:
以上,就是三种管理属性访问的方式
特别说明:截止到本章,《Python 学习手册 第五版》暂时告一段落,后面还有三章内容,39章“装饰器”,40章“元类”,41章“一切美好的事物”
39章和40章,我大概看了一下,自认为比较难看懂和理解,比较是更高级的内容,所以打算暂时放一放,先去加强锻炼之前学习的基础内容
41章是作者对Python发展的一些看法和思考,所以只是了解即可
至此,本书算已基本完成,后续会针对所学基础内容展开更全面的学习和练习,后续规划展开两个内容的学习《Python 编程 第四版》、《利用Python 进行数据分析 第二版》,这两个方向偏向实战和应用篇
后续内容,敬请期待,感谢!
《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章,已完成:《Python学习手册 第五版》 -第32章 类的高级主题
2020.07.06-2020.07.12 第33章,已完成:《Python学习手册 第五版》 -第33章 异常基础
2020.07.13-2020.07.19 第34章,已完成:《Python学习手册 第五版》 -第34章 异常编写细节
2020.07.20-2020.07.26 第35章,已完成:《Python学习手册 第五版》 -第35章 异常对象
2020.07.27-2020.08.02 第36章,已完成:《Python学习手册 第五版》 -第36章 异常的设计
2020.08.03-2020.08.09 第37章,已完成:《Python学习手册 第五版》 -第37章 Unicode和字节串
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章,未完成:一切美好的事情