继续小结py面向对象,关于模块和包。
前面“聊聊python与JavaScript”中提到过,python文件都可以作为模块导入给其他python文件使用,可以直接使用python文件中定义的全局变量和函数,学到对象了,增加了一个可以使用的东西,就是类,即类也可以拿来用!
模块是 Python 程序架构的一个核心概念,每一个以扩展名 py 结尾的 Python 源代码文件都是一个模块,模块名同样也是一个标识符,需要符合标识符的命名规则,在模块中定义的全局变量
、函数、类都是提供给外界直接使用的工具,模块就好比是工具包,要想使用这个工具包中的工具,就需要先导入这个模块。
导入py文件有两种方式:
1、import如
import 模块名1
import 模块名2
如果模块的名字太长,可以使用 as 指定模块别名,以方便在代码中的使用,如
import 模块名 as 模块别名
注意:模块别名也应该符合大驼峰命名法
2、from...import 导入
从某一个模块中,导入部分工具,就可以使用from ... import 的方式
from 模块名 import 工具名
用这种方式导入之后,不需要通过“模块名.”,可以直接使用模块提供的工具
—— 全局变量、函数、类
注意,如果两个模块,存在同名的函数,那么后导入模块的函数,会覆盖掉先导入的函数,开发时 import 代码应该统一写在代码的顶部,更容易及时发现冲突,一旦发现冲突,可以使用 as 关键字给其中一个工具起一个别名
from...import *
# 从模块导入所有工具(与import 模块名一样导入全部工具,区别在于这种方式导入的工具,不需要用
模块名. 方式调用)。这种方式不推荐使用,因为函数重名并没有任何的提示,出现问题不好排查(说说而已)
导入模块要注意的问题:
1、py文件要避免与系统的模块重名,如系统有个random模块(随机数模块),如果当前目录存在一个random.py的文件,那就麻烦了,会导入当前目录下的random模块而非系统提供的random模块!
Python 中每一个模块都有一个内置属性
__file__ 可以查看模块的完整路径,如
import random
print(random.__file__)
2、每个py文件都可以作为模块被其他py文件导入,还有一个问题,如果一个py文件中,除了定义的全局变量、函数和类以外,还有其他的执行语句(按py的说法,所有的没有缩进的代码,如测试用的代码),那么导入时这些代码会被执行一遍。
在实际开发中,每一个模块都是独立开发的,大多都有专人负责,开发人员通常会在模块下方增加一些测试代码,仅在模块内使用,而被导入到其他文件中不需要执行。
处理方法:
利用__name__ 属性,__name__ 是 Python 的一个内置属性,记录着一个字符串,如果是被其他文件导入的,__name__ 值为模块名(文件名),如果是当前文件执行 __name__值为 __main__,因此在模块文件中,可:
if __name__ == "__main__":
#
文件被导入时,下面代码不会被执行!
...
因此在模块文件中可以在最下方:
def main():
...
# 根据 __name__ 判断是否执行下方代码
if __name__ == "__main__":
main()
关于包package:
所谓包,也就是一个供导入的文件夹,里面除了模块文件外,需要一个__init__.py文件列出清单,这样可以一次导入多个模块,包(文件夹)的命名和变量一样,
例:
1、新建一个 hm_message 的包(文件夹和__init__.py文件)
2、在目录下,新建两个文件
send_message 和 receive_message
在 send_message 文件中定义一个 send 函数
def send(text):
print("正在发送 %s..." % text)
在 receive_message 文件中定义一个 receive 函数
def receive():
return "这是来自 100xx 的短信"
在 __init__.py 文件中(要在外界使用包中的模块,需要在 __init__.py 中指定对外界提供的模块列表)
# 从 当前目录 导入 模块列表
from . import send_message
from . import receive_message
3、在外部直接导入 hm_message 的包
import hm_message
hm_message.send_message.send("hello")
txt = hm_message.receive_message.receive()
print(txt)
最后是关于第3方模块的下载安装、卸载,及自己的模块怎样分享给别人,这块内容比较郁闷,教程是基于linux系统的,只讲了在linux下怎么做。。。 |