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 ("最喜欢吃的东西只有蛋卷")

 

posted on 2017-03-14 15:47  印子  阅读(160)  评论(0)    收藏  举报

导航