三、玩转Python语法(二):面向对象
从这一大章节开始,就进入了面向对象的部分,Python 是面向对象的解释型高级动态编程语言,完全支持面向对象的基本功能,只掌握了面向过程是远远不够的,就开发而言,面向对象的重要程度要高于面向过程,如果你学习完了之前所讲的面向过程的内容,并且做了一定量的习题,那么你的基础可以说已经很牢固了,接下来就让我们走进对象的世界,程序员最不缺的是什么?是对象!
1.百宝箱
1.1 自定义模块
🚩首先来介绍一下什么是模块:模块英文为Modules,在Python中一个扩展名为.py的文件就是一个模块,我们写代码时使用模块的好处:
1.方便其它程序和脚本的导入并使用
2.避免函数名和变量名冲突
3.提高代码的可维护性
4.提高代码的可重用性
创建模块其实就是新建一个.py文件,要求名称不能和Python自带的标准模块名称相同,导入模块的代码格式:
# 把模块的内容全部导入
import 模块名称 [as 别名]
# 把模块的部分导入
from 模块名称 import 函数/变量/类
下面我们通过导入 math 模块来讲解上述格式,math 模块中存有很多的数学公式,这些公式将被我们经常调用
# 博主:辰chen # 博客地址:https://chen-ac.blog.csdn.net/ # 开发时间:2021/12/20 20:48 # 欢迎大家关注AIoT相关博客~ import math print(type(math)) print(math.pi) print('----------------') # 使用dir() 可以查看模块中的所有函数 print(dir(math)) # 常用的math中的函数: # 计算几次方: print(math.pow(2, 3)) # 计算2的3次方 # 向上取整 print(math.ceil(9.01)) # 向下取整 print(math.floor(9.99))
我们可以用 [as 别名] 来起别名:
# 博主:辰chen # 博客地址:https://chen-ac.blog.csdn.net/ # 开发时间:2021/12/20 21:09 # 欢迎大家关注AIoT相关博客~ import math as m # 这个操作其实就是我们以后写代码可以用 m 代替 math print(type(m)) print(m.pi) print(m.pow(2, 3)) print(m.ceil(9.01)) print(m.floor(9.99))
我们使用 dir() 函数可以看出 math 模块中有很多的函数,但是我们写代码可能不需要这么多的函数,往往只需要其中的一两个即可,故我们没必要把所有函数都导入,这个时候就可以使用 from 模块名称 import 函数/变量/类 来导入部分的函数,并且以这种形式导入的这些函数不需要 .的调用,可直接使用:
# 博主:辰chen # 博客地址:https://chen-ac.blog.csdn.net/ # 开发时间:2021/12/20 21:12 # 欢迎大家关注AIoT相关博客~ from math import pi, floor print(pi) print(floor(9.99))
那么,我们不是自己也写了很多的模块嘛,是否可以像导入系统模块这样导入我们自己的模块呢?答案是:如果你和我一样下载的是最新版的 PyCharm,是可以的,如果你下载的原来版本的 PyCharm,需要一点额外的操作:
1️⃣ 新版 PyCharm 支持直接调用:
2️⃣ 如果你是老版的 PyCharm 需要右击目录,选择最下方的 Mark Dictionary as,选择 Sources Root,这样的操作后,你就可以像调用系统模块一样调用自己写的模块:
1.2 以主程序形式运行
🚩这部分概念字面理解起来晦涩难懂,没必要看下述定义,如果你很好奇,可以看一下如下定义:在每个模块的定义中都包括一个记录模块名称的变量__name__,程序可以检查该变量,以确定他们在哪个模块中执行。如果一个模块不是被导入到其它程序中执行,那么它可能在解释器的顶级模块中执行。顶级模块的__name__变量的值为__main__
好的,如果我没猜错你没有看懂,无关紧要,我们用代码解释:
比如我们写好了 demo3,并且在 demo4 中导入了 demo3,我们在 demo4 中调用了 demo3 的 add 函数,显然我们只想计算 100 + 200 的值,但是程序的输出结果却是输出了两个数,这是因为我们的 demo3 中还附带这一个计算 10 + 20,这样的结果是我们不想要的,这时,我们既不想删除 demo3 中的 10 + 20,又不想让我们 demo4 在调用 demo3 时输出额外的东西,就可以在 demo3 中 写一行 main:
然后按下回车:并把 print(10 + 20)
放入 if
语句中,这样一来,在别的模块调用 demo3
时,不会输出 if
语句中的内容,只有当 运行 demo3
的时候,才会输出 if
语句中的内容
运行 demo4:
运行 demo3:
1.3 包
🚩包是一个分层次的目录结构,它将一组功能相近的模块组织在一个目录下。包的作用:
1.代码规范
2.避免模块名称冲突
包与目录的区别:
包含__init__.py文件的目录称为包
目录里通常不包含__init__.py文件
建立包的方式:
可以看出,目录和包的区别就是包自带一个__init__.py文件:
包的导入语法结构:
import 包名.模块名