「这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战」
正式的Python专栏第37篇,同学站住,别错过这个从0开始的文章!
前篇学委展示分享了面向对象编程的概念,相信读者们对这个类和对象比较熟悉了。
我们在深入看一下类的结构。
类中的其他内置函数/属性
前文代码展示了‘__init__‘函数,这个是类的内置函数,默认不写就没有执行多余操作。
在Python中类这种结构还包含了下面的一些内置函数属性:
- __name__ 类名字
- __dict__ 类的命名空间字典(这里先不做多解释,其实这个解释虽然抽象但是准确的,下面看代码就能秒懂)
- __doc__ 类的文档说明
- __module__ 类的文档说明
- __bases__ 类的文档说明
看起来比较枯燥无味的样子,除了类的名字,我们看起来好像应该是类的名字(好像废话)
我们还是看一下代码感受一下:
1 | python复制代码#!/usr/bin/env python |
下面是运行效果:
好了,我们看到类的命名空间打印出来dict字典,内放置的内容的key都是类的成员(函数,属性),这下子清楚了:Python用一个dict来说描述类的结构!(这就是学委前篇提到的一张网,它把单一的函数,数据属性,挂到这个网上,组成了类的结构)。
其他几个内置类函数非常好理解。
另一个地方是’__bases__‘函数,它告诉我们student类是在‘object’这个类的基础上创建的。(确实如此!)
内置函数获取其对象属性
python提供了下面的一些函数:
- getattr(对象,属性名,[可选默认值]) : 获取对象的某个属性,如果没有找到返回默认值
- setattr(对象,属性,属性值): 设置对象的,添加/覆盖某个属性为属性值。
- hasattr(对象,属性): 判断对象是否包含某个属性
这个非常直白。
Java同学都知道反射,比较繁琐的。但是在Python中这块做的非常简洁,这个跟__dict__的设计很精巧.
1 | python复制代码#!/usr/bin/env python |
上面的代码学委展示了获取修改属性。以及根据对象是否包含属性,进行setattr。
读者多看一看,特别是代码附加的注释,加深对类和对象的理解。
既然说到了base类,再谈谈类的继承
上面的bases函数返回值的解释,换一句话说:
除了object类,其他所有类默认的都是直接或者间接的继承于object类的;
也就是说,object类是所有的类的根,源头类。
A类继承于B类,那么,我们会使用下面的描述来表示它们:
A类是B类的子类
B类是A类的父类
这个就跟家族族谱一样,最顶上那个第一代元祖父,这就是类和object的关系。
1 | python复制代码#!/usr/bin/env python |
这段代码想要展示的信息很多。
首先是在前面第一段代码后多加了一个Developer类(没有写继承)。
输出我们看到他说继承object类的(所以写跟不写没有差别,这里要注意python版本,学委用的是3.8)
其次,我们看到PirimarySchoolStudent的bases函数的输出是Student,没错,继承某个类之后的base值就为该类,也就是Student
再次,继承让子类直接拥有了父类的函数和数据属性,可以直接访问拿来用。
好了,请仔细看看下面的运行结果:
总结
这次把类和对象的知识补充了一些(但是还有Python支持多继承,这跟Java是很大的区别!),有过半不是常见的。
但是在写框架或者深度分析的时候,非常有用,务必过一过熟悉一下。
可以看看下图,回想一下上面的代码,这就是类命名空间,数据属性,函数属性,模块之间的关系:
我们可以通过命名空间找到函数属性,它们有关联。
此外,获取数据属性只能通过对象应用getattr来获取。
学委写了十几年的Java了,但是写的这套Python教程非常务实,对基础编程有任何问题请查看相关文章。
喜欢Python的朋友,请关注学委的 Python基础专栏 or Python入门到精通大专栏
持续学习持续开发,我是雷学委!
编程很有趣,关键是把技术搞透彻讲明白。
欢迎关注微信,点赞支持收藏!
本文转载自: 掘金