Python - 模块
上一页下一页
模块允许您从逻辑上组织您的 Python 代码。将相关代码分组到一个模块中,使代码更易于理解和使用。模块是一个 Python 对象,具有可以绑定和引用的任意命名属性。
简单地说,模块是由 Python 代码组成的文件。一个模块可以定义函数、类和变量。一个模块也可以包含可运行的代码。
示例
名为 aname 的模块的 Python 代码 通常位于名为 aname.py 的文件中 .这是一个简单模块的示例,support.py
def print_func( par ): print "Hello : ", par return
导入 声明
通过在其他 Python 源文件中执行 import 语句,您可以将任何 Python 源文件用作模块。 导入 具有以下语法 -
import module1[, module2[,... moduleN]
当解释器遇到 import 语句时,如果模块存在于搜索路径中,它会导入该模块。搜索路径是解释器在导入模块之前搜索的目录列表。例如,要导入模块 support.py,您需要将以下命令放在脚本顶部 -
#!/usr/bin/python # Import module support import support # Now you can call defined function that module as follows support.print_func("Zara")
执行上述代码时,会产生以下结果 -
Hello : Zara
一个模块只加载一次,不管它被导入多少次。如果发生多次导入,这可以防止模块执行一遍又一遍。
从...导入 声明
Python的来自 语句允许您将模块中的特定属性导入当前命名空间。 from...import 具有以下语法 -
from modname import name1[, name2[, ... nameN]]
例如,要从模块 fib 导入函数 fibonacci,请使用以下语句 -
from fib import fibonacci
该语句不会将整个模块 fib 导入当前命名空间;它只是将模块 fib 中的项 fibonacci 引入到导入模块的全局符号表中。
from...import * 声明
也可以使用以下 import 语句将模块中的所有名称导入当前命名空间 -
from modname import *
这提供了一种将模块中的所有项目导入当前命名空间的简单方法;但是,应谨慎使用此语句。
定位模块
导入模块时,Python 解释器会按以下顺序搜索模块 -
-
当前目录。
-
如果没有找到该模块,Python 会搜索 shell 变量 PYTHONPATH 中的每个目录。
-
如果一切都失败了,Python 会检查默认路径。在 UNIX 上,这个默认路径通常是 /usr/local/lib/python/。
模块搜索路径以 sys.path 的形式存储在系统模块 sys 中 多变的。 sys.path 变量包含当前目录、PYTHONPATH 和依赖于安装的默认值。
PYTHONPATH 变量
PYTHONPATH 是一个环境变量,由目录列表组成。 PYTHONPATH 的语法与 shell 变量 PATH 的语法相同。
这是来自 Windows 系统的典型 PYTHONPATH -
set PYTHONPATH = c:\python20\lib;
这是来自 UNIX 系统的典型 PYTHONPATH -
set PYTHONPATH = /usr/local/lib/python
命名空间和范围
变量是映射到对象的名称(标识符)。 命名空间 是一个变量名(键)及其对应对象(值)的字典。
Python 语句可以访问 本地命名空间 中的变量 在全局命名空间中 .如果局部变量和全局变量同名,则局部变量会隐藏全局变量。
每个函数都有自己的本地命名空间。类方法遵循与普通函数相同的作用域规则。
Python 对变量是局部变量还是全局变量进行有根据的猜测。它假定在函数中赋值的任何变量都是局部变量。
因此,为了给函数内的全局变量赋值,必须先使用global语句。
语句 global VarName 告诉 Python VarName 是一个全局变量。 Python 停止在本地命名空间中搜索变量。
例如,我们定义一个变量Money 在全局命名空间中。在函数 Money 内 , 我们分配 Money 一个值,因此 Python 假定 Money 作为局部变量。但是,我们访问了局部变量 Money 的值 在设置它之前,结果是 UnboundLocalError 。取消注释全局语句可以解决问题。
#!/usr/bin/python Money = 2000 def AddMoney(): # Uncomment the following line to fix the code: # global Money Money = Money + 1 print Money AddMoney() print Money
dir()函数
dir() 内置函数返回一个排序的字符串列表,其中包含模块定义的名称。
该列表包含在模块中定义的所有模块、变量和函数的名称。以下是一个简单的例子 -
现场演示#!/usr/bin/python # Import built-in module math import math content = dir(math) print content
执行上述代码时,会产生以下结果 -
['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp', 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log', 'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh']
这里,特殊的字符串变量 __name__ 是模块的名称,__file__ 是加载模块的文件名。
globals() 和 locals() 函数
globals() 和 locals() 函数可用于返回全局和局部命名空间中的名称,具体取决于调用它们的位置。
如果从函数内部调用 locals(),它将返回可以从该函数本地访问的所有名称。
如果从函数内部调用 globals(),它将返回可以从该函数全局访问的所有名称。
这两个函数的返回类型都是字典。因此,可以使用 keys() 函数提取名称。
reload() 功能
将模块导入脚本时,模块顶层部分的代码只执行一次。
因此,如果要重新执行模块中的顶层代码,可以使用 reload() 功能。 reload() 函数再次导入之前导入的模块。 reload() 函数的语法是这样的 -
reload(module_name)
这里,module_name 是您要重新加载的模块的名称,而不是包含模块名称的字符串。例如,重新加载 hello 模块,执行以下操作 -
reload(hello)
Python 中的包
包是一种分层的文件目录结构,定义了一个单一的Python应用环境,由模块和子包、子子包等组成。
考虑一个文件 Pots.py 在电话中可用 目录。该文件具有以下源代码行 -
#!/usr/bin/python def Pots(): print "I'm Pots Phone"
类似地,我们还有另外两个同名的具有不同功能的文件 -
-
电话/Isdn.py 具有函数 Isdn() 的文件
-
电话/G3.py 具有函数 G3() 的文件
现在,在 Phone 中再创建一个文件 __init__.py 目录 -
- 电话/__init__.py
要在导入 Phone 后使所有功能可用,您需要在 __init__.py 中添加显式导入语句,如下所示 -
from Pots import Pots from Isdn import Isdn from G3 import G3
将这些行添加到 __init__.py 后,在导入 Phone 包时所有这些类都可用。
#!/usr/bin/python # Now import your Phone Package. import Phone Phone.Pots() Phone.Isdn() Phone.G3()
执行上述代码时,会产生以下结果 -
I'm Pots Phone I'm 3G Phone I'm ISDN Phone
在上面的示例中,我们以每个文件中的单个函数为例,但您可以在文件中保留多个函数。您还可以在这些文件中定义不同的 Python 类,然后您可以从这些类中创建包。
Python