1.模块
任何Python程序都可以作为模块导入
在导入模块的时候,你可能会看到有新文件(以.pyc为扩展名)出现,它已经经过了(编译)处理
这是因为在导人模块的时候,其中的代码被执行了。不过如果再次导人该模块,就什么都不会发生,也就是说导入模块多次和导入一次的效果是一样的
如果稍后导入同一个模块,Python会导入.pyc文件而不是.py文件,除非.py文件发生了改变(此时,会生成新的.pyc文件)
如果你在程序运行的时侯更改了模块并且希望将这些更改反映出来,可以使用内建的reload函数,它带有一个参数(要重新载入的模块),并且返回重新载入的模块
import importlib
x = importlib.reload(x)
模块最重要的用处在于它们(像类一样)可以保持自己的作用域,也就意味着定义的所有类和函数以及赋值后的变量都成为了模块的特性
如果希望在模块中添加一些检查模块本身是否正常工作的测试代码,但是不希望这些测试代码被导入后的文件使用,可以使用__name__变量:
def hello():
print("Hello,world!")
def test():
hello()
if __name__=='__main__':test() #判断当前文件是否是主程序
让模块可用的方法:
1.将模块放置在合适的位置
找出Python解释器从哪里查找模块,然后将你自己的文件放置在那里即可
import sys,pprint
pprint.pprint(sys.path) #当数据结构过大以至于不能在一行打印完时,可以使用pprint模块中的pprint函数替代普通的print语句
site-packages目录是最佳选择
当不希望自己的模块填满Python解释器的目录、没有在Python解释器目录中存储文件的权限或想将模块放在其他地方时,可以试试另一种方法
2.告诉解释器要去哪里查找需要的模块
2.1 修改sys.path
import sys
sys.path.append('路径') #告诉解释器:除了从默认的目录中寻找之外,还需要从所给路径中寻找模块
import hello #导入想要的模块
2.1 在PYTHONPATH环境变量中包含模块所在的目录
2.包
包相当一另外一类模块,它是模块所在的目录
要使Python将模块所在的目录作为包对待,必须让目录包含一个命名为__init__.py的文件(模块)
如果将包作为普通模块导入的话,文件的内容就是包的内容
#有个名为constants的包,文件constants/__init__.py包括语句PI=3.14
import constants
print(constants.PI)
import drawing #drawing中_init_ 模块的内容是可用的,但shapes和colors模块则不可用
import drawing.colors #能通过drawing.colors来使用colors模块
from drawing import shapes #能通过shapes来使用shapes模块
3.探究模块
探究模块最直接的方式就是在Python解释器中研究它们,要做的第一件事就是导入它
查看模块包含的内容可以使用dir函数,它会将对象(以及模块的所有函数、类、变量等)的所有特性列出。如果打印出dir(模块名)的内容,会看到一长串名字,其中一些名字以下划线开始——暗示(约定俗成)它们并不是为在模块外部使用而谁备的,我们可以用列表推导式过滤掉它们
import copy
print(dir(copy)) #['Error', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_copy_dispatch', '_copy_immutable', '_deepcopy_atomic', '_deepcopy_dict', '_deepcopy_dispatch', '_deepcopy_list', '_deepcopy_method', '_deepcopy_tuple', '_keep_alive', '_reconstruct', 'copy', 'deepcopy', 'dispatch_table', 'error']
print([n for n in dir(copy) if not n.startswith("_")]) #['Error', 'copy', 'deepcopy', 'dispatch_table', 'error']
__all__:定义了模块的公有接口
print(copy.__all__) #['Error', 'copy', 'deepcopy']
help:获取帮助信息,帮助信息实际上是从文档字符串中提取的
文档字符串是写在函数开头并且简述函数功能的字符串,该字符串可以通过__doc__特性引用
help(copy.copy)
# Help on function copy in module copy:
# copy(x)
# Shallow copy operation on arbitrary Python objects.
__file__:查找模块的源代码
print(copy.__file__)
“Python库参考手册”:描述了标准库中的所有模块,可以帮助我们获悉一些有关Python的事实
可以在线浏览(https://docs.python.org/library)和下载,其他的标准文档(如“Python 入门指南”和“Python 语言参考手册”)也是如此
所有的文档都能在Python网站(https://docs.python.org)上找到