009. Python入门经典之二:模块
模块提供了一种在应用程序之间共享Python代码的便捷方式. 模块是一种非常简单的结构,在python中模块只是有Python语句组成的文件, 在模块中可以定义函数和类, 可以包含简单的可执行代码,这些可执行代码不在函数或者类的内部, 而最好的一点是, 模块可以包含说明如何使用模块代码的文档.简单来说, 模块只是一个python源文件, 可以包含变量, 类, 函数和Python脚本中可用到的其他任何元素
列出模块的所有属性
import sys print (dir(sys)) #列出sys这个模块所有的属性 #输出结果: 有省略 ['__displayhook__', '__doc__', '__excepthook__', '__name__', '__package__', ...] print (sys.__name__) #列出sys模块的模块名字, 这里的输出就是 sys print (sys.__doc__) #列出sys模块中, 所有属性/方法的使用介绍 print (sys.__package__) #不知道问什么输出None, 以后学会再来修改这里
导入模块的几种方法
import moduleName from moduleName import item #这种导入的方法, 可以仅仅导入模块中的某个类(函数) import moduleName import imp imp.reload(moduleName) #使用新的模块 imp来替代moduleName #注: 使用rmp.relad时, 总是要使用圆括号, 而使用import时, 则不要使用圆括号 from Meal import * #导入Meal模块的全部公有方法, 什么是公有方法? 如果Meal模块中定义了变量__all__, python的解释器会使用__all__来确定哪些是公有项, 可以到Meal中去看看,如果Meal模块中没有定义变量__all__, 则默认导入所有不以 下划线(_)开头的所有项,作为默认设置, 应该时刻为模块定义__all__变量
python如何查找模块
#为了导入一个模块, python解释器首先就是要找到它, 对于调用的模块, Python解释器首先查找一个名称为moduleName.py的文件, 其中moduleName是传递给import的参数(即文件名), 当找到该文件的时候, python解释器会将其编译成一个.pyc文件. 当再次导入模块时,python解释器可以加载编译好的模块. 加速Python脚本的运行. Python解释器只会查找指定的目录(sys.path变量所指定的值). 如果找不到, 则显示一个错误, 如下print sys.path
#输出结果:
'''
['C:/Users/LG/Desktop/FirstDemoPython/Kitchen', #首当其冲找当前目录
'D:\\IDE_INPUT\\PyCharm 2016.3.2\\helpers\\pydev',
'C:\\Users\\LG\\Desktop\\FirstDemoPython',
'D:\\IDE_INPUT\\PyCharm 2016.3.2\\helpers\\pydev',
'C:\\WINDOWS\\SYSTEM32\\python27.zip',
'D:\\IDE_INPUT\\Python27\\DLLs',
'D:\\IDE_INPUT\\Python27\\lib',
'D:\\IDE_INPUT\\Python27\\lib\\plat-win',
'D:\\IDE_INPUT\\Python27\\lib\\lib-tk',
'D:\\IDE_INPUT\\Python27',
'D:\\IDE_INPUT\\Python27\\lib\\site-packages']
'''
#查找不到指定模块的报错信息
#import errn
'''
Traceback (most recent call last):
File "D:\IDE_INPUT\PyCharm 2016.3.2\helpers\pydev\pydevd.py", line 1596, in <module>
globals = debugger.run(setup['file'], None, None, is_module)
File "D:\IDE_INPUT\PyCharm 2016.3.2\helpers\pydev\pydevd.py", line 974, in run
pydev_imports.execfile(file, globals, locals) # execute the script
File "C:/Users/LG/Desktop/FirstDemoPython/Kitchen/Python_mokuai_10.py", line 32, in <module>
import errn
ImportError: No module named errn
'''
如何创建和调用模块, 及其仅导入部分模块
import food print dir (food) #输出结果: ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'favoriteFood'] #调用food模块中的函数 print (food.favoriteFood()) #输出结果: 最喜欢吃的东西只有蛋卷 #print(favoriteFood()) #如果直接使用favoriteFood()函数则会报错: NameError: name 'favoriteFood' is not defined, 可以通过夏敏的导入方法来解决 from food import favoriteFood print (favoriteFood()) #输出结果: 最喜欢吃的东西只有蛋卷
(模块)的文档书写规范和内容建议:
#1. 如何调用函数/方法, 及其它的返回值/参数
#2. 此类/方法的租用.
#3. 调用此类/方法的要求
#4. 此类/方法可能对系统产生的影响, 比如删除磁盘文件, 写入内容
#5. 可能产生的异常和导致这些异常的原因
#print (help(Meal)) #使用help来浏览模块的文档
#输出结果: class Meal
#在这个菜谱里面包含了食品和饮料. 包含了食品的饮料的set方法, 并且为其设置类名; 这里有点奇怪; 类名难道不是Meal
#此类的每个实例保存了3个数据值: Meal类的名称. 食物和饮料
#默认这些值为: 类名: generic meal (普通餐)
#饮料: 咖啡
#食物: 蛋卷
lunch = makeLunch()
lunch.printIt("\t")
#输出结果: ('\t', 'A fine', 'midday meal', 'with', 'sandwich', 'and', 'gin and tonic')
import Meal
breakfast = Meal.makeBreakfast()
breakfast.printIt("\t")
#输出结果: ('\t', 'A fine', 'breakfast', 'with', 'omelet', 'and', 'coffee')
#破坏测试
Meal = Meal.makeDinner()
Meal.printIt("\t")
#输出结果: ('\t', 'A gourmet', 'dinner', 'with', 'steak', 'and', 'merlot') , 这里没有错误
#Meal.makeDinner() #到这里就点不出来的了, 强行写的话, 就会报错, 因为Meal本身是个类, 但是这里作为变量了
安装模块
查看sys.path可以看出, Python在解释代码的时候, 优先去当前目录寻找, 然而如果希望在多个脚本或多个系统中使用刚编写的模块, 需要将其安装sys.path变量所列出的目录下, 多数情况他是在..\\Python27\\lib\\site-packages路径下.
food.py文件内容如下:
#coding:utf-8
def favoriteFood():
print ("最喜欢吃的东西只有蛋卷")
浙公网安备 33010602011771号