python 模块、包 笔记

模块 包含与一个公共主题相关联的一组函数、方法或者数据

导入可用模块:首先要在操作系统上安装该模块

1 开始使用模块的最简单的方式是用import关键字导入它:import sys 导入名称为sys的模块,它包含了python提供的主要与各个系统有关的服务。

例:为了创建foods模块,仅需要创建foods.py文件。创建后,可以通过使用foods名称导入创建的模块,而不用在模块名称尾部添加.py

python 自动搜寻的路径或者目录列表存储于sys模块的path变量中。import sys   sys.path

使用append方法增加一个目录,或用extend方法增加任意数量的目录。

>>> import sys
>>> sys.path
['', 'D:\\Program Files\\Python\\Python37\\Lib\\idlelib', 'D:\\Program Files\\Python\\Python37\\python37.zip', 'D:\\Program Files\\Python\\Python37\\DLLs', 'D:\\Program Files\\Python\\Python37\\lib', 'D:\\Program Files\\Python\\Python37', 'D:\\Program Files\\Python\\Python37\\lib\\site-packages']
>>> sys.path.append("E:\pythonscript")
>>> sys.path
['', 'D:\\Program Files\\Python\\Python37\\Lib\\idlelib', 'D:\\Program Files\\Python\\Python37\\python37.zip', 'D:\\Program Files\\Python\\Python37\\DLLs', 'D:\\Program Files\\Python\\Python37\\lib', 'D:\\Program Files\\Python\\Python37', 'D:\\Program Files\\Python\\Python37\\lib\\site-packages', 'E:\\pythonscript']
>>> import foods
>>> dir(foods)
['Fridge', 'Omelet', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']

当使用import导入模块时,它包含的所有名称都被放到了该 模块命名的作用域中。也就是说,作用域的名称就是import语句中使用的名称。

2 使用from 修饰符用于import命令,可以直接使用 import后的名称 from foods import Omelet

from foods import Recipe

r=Recipe()

如果有多个级别 要在当前作用域使用名称。需要from foods.recipes import b

3 有时需要不用显式地指定模块中每个可用的名称而使用模块的所有内容。为此python提供了一个特殊字符*,它用于 from...inport * 语句。在导入到全局作用域时,只能使用*进行导入

包,类似目录 文件夹 结构。使用得同一目录下的文件在一起使用时就像单独的模块

创建kitchen目录,并在其中创建__init__.py文件,名称前后各有两个下划线。该文件提示python这是个包目录 ,而不仅是包含python文件的普通目录。

__init__文件包含了控制包的用法的代码。当导入包时,目录中的每个文件并没有立即导入。__init__.py文件首先被计算,它指定了要使用的文件以及使用它们的方式。

在kitchen文件夹下添加两个类:fridge.py omelet.py

1 在__init__文件中引入类:这个在导入kitchen包后这些类都变得可用

from Fridge import Fridge
from Omelet import Omelet

需要将kitchen 加入自动加载目录,这样才能找到 其中的 模块 如fridge否则提示出错

>>> sys.path.append("E:\\pythonscript\\kitchen") 
>>> import kitchen
>>> f=kitchen.Fridge()

2 如果不想使用kithche. 需要在 __init__.py文件中添加 __all__列表

from Fridge import Fridge
from Omelet import Omelet
__all__=['Fridge','Omelet']

>>> from kitchen import *
>>> f=Fridge()

3 如果 __init__.py 文件 中不添加 from Omelet import Omelet 需要引用时使用:Omelet.Omelet()

出现在__all__列表中的所有名称也仅有这些名称可通过*导出。

__all__列表中出现的元素可以是函数、类的名称或数据,它们都可以通过import * 被自动导入到程序的全局作用域

pyc 文件:这是python输出 的一个特殊文件,它包含了某种形式的代码,这些代码比纯文本源代码更易于快速地加载和运行。如里对.py文件做了修改,下次调用它时通过双击它 或都运行python -i 或使用 run 菜单 ,python将根据更新过的源代码重新创建.pyc文件。

python将模块的名称以及模块的来源都隐藏在一个特殊的sys.modules下,包含了目前已经导入的全部模块。

查看加载的模块:list(sys.modules.keys())

在加载了模块后,它将出现sys.modules字典中,此后,即使改变了模块,python也不再重新计算它。可以简单地交模块从sys.modules字典中移除,然后再次导入它。

>>> import kitchen
>>> 'kitchen' in sys.modules
True
>>> sys.modules['kitchen']
<module 'kitchen' from 'E:\\pythonscript\\kitchen\\__init__.py'>
>>> sys.modules.pop('kitchen')
<module 'kitchen' from 'E:\\pythonscript\\kitchen\\__init__.py'>
>>> sys.modules['kitchen']
Traceback (most recent call l

python 提供了一个内置函数reload,它重新加载指定的模块,效果与手动重新加载一样:

import kitchen

>>> import imp
>>> imp.reload(kitchen)

注意 这不会影响已经存在的对象,需要重新调用这类并重新创建它们的对象

o=Omelet.Omelet()

 __name__ 返回正在运行的作用域的名称,__main__是一个特殊的保留字,这是顶层全局作用域的名称。

验证模块是否可以正常工作 ,可以在模块的尾部使用这个语句:if __name__=='__main__'

python 利用模块为局部名称保留一个作用域。模块内部的名称可被直接使用。要在一个特定模块的外部访问模块内的名称,首先需要指定模块名称,之后跟着一个句点,再后面要访问的名称。

为了使用一个模块,必须用import语句将它导入到程序中。python检查sys.path列表中的每个目录,直到找到该文件为止。

通常希望在不必输入完整路径的情况下,使用某个模块的特定部分。完整的路径以模块名称开始,后面跟着任何中间模块的名称 用句点分隔,最后是实际需要的名称。可以用from...import导入频繁使用的名称。

当要编写的代码量较大时,可以用包将代码组织起来,包结构以目录开始,将包导入程序后,该目录的名称就是包的名称。__init__.py文件将普通的目录变为包。该文件包含对整个包有用的代码,例如包的所有部分共享的数据、版本信息和重要文件的存储位置等,文件中还包含必要的import语句,当用语句from...import * 请求一个包时,包中的文件不会被自动导出,即使这些文件已经在__init__.py中被导入,应该在列表__all__中指定包中需要默认导出的名称。

猜你喜欢

转载自www.cnblogs.com/caojuansh/p/11579812.html