20. 企业级开发基础1:自定义模块

本节内容

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 user
import goods

user.showInfo("tom", 18)
goods.showGoods("alienware", 14999)

拆分模块的好处是第一、将一个比较复杂的单文件拆分成多个文件,方便代码的管理和开发维护,第二、我们开发并完善好的Python模块,在其他需要这个模块功能的地方就可以直接引入组合这个模块,不需要重复编写Python代码了,第三、不同的python模块中,就可以使用相同名称的变量了,不同模块中的变量不会互相覆盖数据或者产生冲突,降低了我们代码开发的成本

2. 模块的使用和解决的问题

拆分模块之后,我们会遇到这样的问题

2.1. 变量名称冲突

变量名称在不同的python文件/模块中,同名变量不会互相产生冲突

user.py 用户模块
--------------
# 记录当前系统中用户数量的变量count
count = 12
# 打印当前系统中用户数量的函数
def getCount():
      print("user count:" + str(count))
--------------
goods.py 商品模块
--------------
# 记录当前系统中商品数量的变量count
count = 1001
# 获取并答应当前系统中所有商品数量的函数
def getCount():
      print("goods count:" + str(count))
--------------
main.py 主模块中使用其他的模块
--------------
import user
import goods
user.getCount()  #执行结果:12
goods.getCount() # 执行结果:1001
2.2. 模块名称冲突

我们也同样考虑到了,模块名称和定义变量一样,某些情况下模块名称也有可能冲突,如:我们的项目中处理用户数据定义了一个工具模块utils.py,处理商品数据定义了一个工具模块utils.py,此时这两个模块冲突了;解决方案如下
我们会将不同的模块,python定义了包的概念,根据处理的功能或者数据的不同,存放在不同的包中,用于区分不同的模块;
包在python中,就是一个文件夹,为了区分包文件夹和普通的文件夹,在包文件夹中,必须定义一个__init__.py模块文件,这个文件内容可以为空。

# 1. 创建users文件夹,是用来处理用户数据的包
# 2. 在users文件夹下创建__init__.py文件,内容可以为空
# 3. 在users文件夹下创建utils.py工具模块
--------------
"这是处理用户数据的工具模块"
x = 129.00
y = 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.utils
import goods.utils
xx, yy = users.utils.getLocation()
addr = goods.utils.getProduction()
print(xx, yy)
print(addr)
包->模块开发

3. 模块中再说变量

变量在之前的课程中,我们已经提到了变量在Python中有局部变量和全局变量的区分,是通过是否定义在函数内部来区分的。
此时有了多模块之后,对于变量的作用域,需要进行更加细致的划分。

3.1. 模块内部

模块内部,还是按照正常的情况进行划分,按照是否定义在函数内部来区分全局变量和局部变量,在模块文件内部,变量的使用没有任何的变量
在模块内部,变量依旧是全局变量/局部变量,变量的作用域正常使用即可

"这是一个用户数据处理模块"
# 全局变量,记录系统中用户的在线人数
onlineCount = 100

def 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
# !这不是我们想要的,私有的不是不能让其他模块访问吗?
# !这里请注意:下划线开头的变量,规范是私有变量,不应该
# 让其他的模块访问,而不是强制,这里的规范是一种项目开发约定!
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

大牧莫邪.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容