我与python约个会:20. 企业级开发基础1:自定义模块
来源:互联网 发布:战网更新网络错误 编辑:程序博客网 时间:2024/05/17 08:43
本节内容
1 模块的概念和意义
2 模块的定义和使用
3 再说变量的作用域
之前的课程中,我们已经了解了python程序设计开发的基础部分内容
包含了数据类型、变量、运算符、程序选择结构、循环结构、函数处理、字符串处理等等内容。
本节内容开始,我们开始学习python企业级开发基础部分的内容,会涉及到模块式整合开发、面向对象程序设计、错误的调试和测试、高级开发[文件IO处理,网络编程,多线程程序开发、正则表达式等等]内容,
1. 模块的概念和意义
我们在常规程序开发的过程中,如果只是通过python来写一些项目维护的小脚本程序,前面学过的内容已经基本够用了,但是如果涉及到企业级开发的复杂的一些需求的话,程序设计开发过程中会出现大量的代码,如果着大量的代码(如:1万行代码)写在一个python文件中,就会让这个文件的体积非常的庞大,开发过程中会造成大量的不必要的问题:如变量定义是否会覆盖其他定义的变量,添加功能处理代码会否影响其他的功能,由于大量代码集中在一个文件中导致修改维护变得非常的不容易,代码的可读性非常 差等等各种问题。
此时,为了方便我们将不同的处理功能区分开,我们将处理不同数据或者功能的函数分别分组存放在不同的python文件中,就会将上面一个比较庞大的python文件拆分成多个python文件,每个python文件中的代码内容会比较少,通过多个Python文件互相组合的方式来完成复杂的处理功能。这样拆分的不同的python文件,每个python文件就是一个单独的python模块,专业术语:module
我们定义好的Python模块,可以在需要的地方,通过import 模块名称
关键字来引入这个模块,代码如下:
user.py 用户模块--------------def showInfo(name, age): print("user info: name[" + name + "] age [" + age + "]")--------------goods.py 商品模块--------------def showGoods(name, price): print("goods info: goodsName: [" + name + "] price [¥" + str(price)+ "]")--------------main.py 主模块中使用其他的模块--------------import userimport goodsuser.showInfo("tom", 18)goods.showGoods("alienware", 14999)
拆分模块的好处是第一、将一个比较复杂的单文件拆分成多个文件,方便代码的管理和开发维护,第二、我们开发并完善好的Python模块,在其他需要这个模块功能的地方就可以直接引入组合这个模块,不需要重复编写Python代码了,第三、不同的python模块中,就可以使用相同名称的变量了,不同模块中的变量不会互相覆盖数据或者产生冲突,降低了我们代码开发的成本
2. 模块的使用和解决的问题
拆分模块之后,我们会遇到这样的问题
2.1. 变量名称冲突
变量名称在不同的python文件/模块中,同名变量不会互相产生冲突
user.py 用户模块--------------# 记录当前系统中用户数量的变量countcount = 12# 打印当前系统中用户数量的函数def getCount(): print("user count:" + str(count))--------------goods.py 商品模块--------------# 记录当前系统中商品数量的变量countcount = 1001# 获取并答应当前系统中所有商品数量的函数def getCount(): print("goods count:" + str(count))--------------main.py 主模块中使用其他的模块--------------import userimport goodsuser.getCount() #执行结果:12goods.getCount() # 执行结果:1001
2.2. 模块名称冲突
我们也同样考虑到了,模块名称和定义变量一样,某些情况下模块名称也有可能冲突,如:我们的项目中处理用户数据定义了一个工具模块utils.py,处理商品数据定义了一个工具模块utils.py,此时这两个模块冲突了;解决方案如下
我们会将不同的模块,python定义了包的概念,根据处理的功能或者数据的不同,存放在不同的包中,用于区分不同的模块;
包在python中,就是一个文件夹,为了区分包文件夹和普通的文件夹,在包文件夹中,必须定义一个__init__.py模块文件,这个文件内容可以为空。
# 1. 创建users文件夹,是用来处理用户数据的包# 2. 在users文件夹下创建__init__.py文件,内容可以为空# 3. 在users文件夹下创建utils.py工具模块--------------"这是处理用户数据的工具模块"x = 129.00y = 432.24# 获取用户当前位置的函数def getLocation(): # 返回用户位置数据 return x, y--------------#4. 创建goods文件夹,是用来处理用户数据的包#5. 在goods文件夹下创建__init__.py文件,内容可以为空#6. 在goods文件夹下创建utils.py工具模块--------------"这是处理商品数据的工具模块"address = "河南郑州"# 获取商品产地的函数def getProduction(): # 返回商品的产地 return address--------------7.创建main.py程序运行的入口文件,引入users和goods两个模块使用不同模块中的函数--------------import users.utilsimport goods.utilsxx, yy = users.utils.getLocation()addr = goods.utils.getProduction()print(xx, yy)print(addr)
3. 模块中再说变量
变量在之前的课程中,我们已经提到了变量在Python中有局部变量和全局变量的区分,是通过是否定义在函数内部来区分的。
此时有了多模块之后,对于变量的作用域,需要进行更加细致的划分。
3.1. 模块内部
模块内部,还是按照正常的情况进行划分,按照是否定义在函数内部来区分全局变量和局部变量,在模块文件内部,变量的使用没有任何的变量
在模块内部,变量依旧是全局变量/局部变量,变量的作用域正常使用即可
"这是一个用户数据处理模块"# 全局变量,记录系统中用户的在线人数onlineCount = 100def getUserinfo(name): # 定义了一个局部变量,这个局部变量只能在当前函数内部访问 msg = "尊敬的用户您好," if name == "": name = "游客" return msg + name;
3.2. 不同模块之间的变量访问
python中定义了模块之后,不同模块之间访问数据和函数的情况就比较常见了;模块中的变量,有些是需要让别的模块访问的,有些是不希望别的模块访问的,此时就会将变量区分为模块公开的变量、模块私有的变量两种变量了。
python的模块中,按照正常的命名规则命名的变量或者函数,规范为公开的变量或者函数,其他的模块都可以正常的访问
python的模块中,使用一个下划线开头来命名的变量或者函数,规范为私有的变量或者函数,只能在当前模块中使用
python的模块中,使用两个下划线开头的变量,可以别模块直接引用使用具有特殊的含义,如__name__表示当前模块名称等等;规范要求我们自己的变量名称尽量不要使用这样的名称。
"商品信息管理模块goods.py"# 游客打折折扣,变量名称下划线开头,不希望其他模块访问_discountVisitor = 9.5# 会员打折折扣,变量名称下划线开头,不希望其他模块访问_discountMember = 8.5# 游客购买折扣计算,函数名称下划线开头,不希望其他模块访问def _visitorBuy(goodsName, price): resPrice = price * _discountVisitor; print("尊敬的游客,您购买了" + name + ",总价格是:" + str(resPrice));# 会员购买折扣计算,函数名称下划线开头,不希望其他模块访问def _memberBuy(goodsName, price): resPrice = price * _discountMember; print("尊敬的游客,您购买了" + name + ",总价格是:" + str(resPrice));# 购买商品的函数,允许其他模块访问的函数,正常命名def buy(type, name, price): if type == 1: _visitorBuy(name, price) elif type == 2: _memberBuy(name, price); else: print("对不起,您没有权限购买商品")
注意:这里出现了公开/公有变量和私有变量/函数的概念,公开/公有变量/函数就是我们平时定义的普通的全局变量/函数;这里的私有变量/函数,是在原有的全局变量/函数的基础上,变量名称前面加了一个下划线,约定这是私有的变量/函数,不应该让其他的模块访问【记住:这里的约定,不是强制,所以其他模块如果要访问这样的私有变量,还是可以访问到的,但是规范上不应该这么做】
"用户信息处理模块users.py"# 这里定义了一个私有的变量 _userType和_userDesc_userType = "管理员"_userDesc = "游客操作权限,只能访问不能修改任何信息"def _changeDisc(_userType): if _userType == "管理员": _userDesc = "超级管理员操作权限" if _userType == "会员": _userDesc = "普通操作权限,不能修改敏感信息"-------------------------"程序运行的主要模块main.py"import users# 使用users模块中的_userType变量print(users._userType)users._userType = "会员"print(users._userType)# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *# 上面的代码中,我们可以在main模块中,访问引入的# 另一个模块users模块中定义的私有变量_userType# !这不是我们想要的,私有的不是不能让其他模块访问吗?# !这里请注意:下划线开头的变量,规范是私有变量,不应该# 让其他的模块访问,而不是强制,这里的规范是一种项目开发约定!# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- 我与python约个会:20. 企业级开发基础1:自定义模块
- 我与python约个会:21. 企业级开发基础2:使用第三方模块
- 我与python约个会:22.企业级开发基础3:类和对象
- 我与python约个会:24. 企业级开发基础5:面向对象特征(封装)
- 我与python约个会:23. 企业级开发基础4:面向对象
- 我与python约个会:25. 企业级开发基础6:面向对象特征(继承)
- 我与python约个会:26. 企业级开发基础7:面向对象特征(多态)
- 我与python约个会:27. 企业级开发基础8:面向对象扩展
- 我与python约个会:28. 企业级开发基础9:异常处理
- 我与python约个会:29.企业级开发进阶1:文件输入输出流[IO操作]
- 我与python约个会:30.4. 企业级开发进阶2.4:服务端快捷开发
- 我与python约个会:30.企业级开发进阶2:网络编程
- 我与python约个会:30.1. 企业级开发进阶2.1:TCP编程
- 我与python约个会:30.2. 企业级开发进阶2.2:TCP实战
- 我与python约个会:30.3. 企业级开发进阶2.3:UDP编程
- 我与python约个会:31.企业级开发进阶3.1:发送电子邮件
- 我与python约个会:31.2企业级开发进阶3.2:接收电子邮件
- 我与python约个会:32.企业级开发进阶4:正则表达式
- 搜索文件
- SQL数据库入门基础
- String 创建 原理
- Error:A potentially dangerous Request.Form value was detected from the (WebEditor1="...bsp; <B>
- (69)环境音Actor用户指南
- 我与python约个会:20. 企业级开发基础1:自定义模块
- Python列表基本增减操作
- 层次聚类实例以及Java实现
- BZOJ4879: [Lydsy2017年5月月赛]失控的数位板
- 《Using OpenRefine》翻译~7
- Assuming easy carbon removal from the atmosphere is a high-stakes gamble, Stanford scientists say
- SpringMVC 基础笔记(一)
- 我与python约个会:21. 企业级开发基础2:使用第三方模块
- libevent多线程使用bufferevent的那些事