Modules
模块允许您逻辑地组织Python代码。 将相关代码分组到模块中使代码更易于理解和使用。 模块是一个Python对象,具有可以绑定和引用的任意命名属性。
简单地说,模块是由Python代码组成的文件。 模块可以定义函数,类和变量。 模块还可以包括可运行代码。
例子 (Example)
名为aname的模块的Python代码通常位于名为aname.py的文件中。 这是一个简单模块support.py的示例
def print_func( par ):
print "Hello : ", par
return
import声明
您可以通过在其他Python源文件中执行import语句,将任何Python源文件用作模块。 import具有以下语法 -
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
无论导入的次数如何,模块仅加载一次。 如果发生多次导入,这可以防止模块执行一次又一次地发生。
from...import语句
Python的from语句允许您将模块中的特定属性导入当前命名空间。 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
命名空间和范围
变量是映射到对象的名称(标识符)。 namespace是变量名称(键)及其对应的对象(值)的字典。
Python语句可以访问local namespace和global namespace local namespace中的变量。 如果局部变量和全局变量具有相同的名称,则局部变量将影响全局变量。
每个函数都有自己的本地名称空间。 类方法遵循与普通函数相同的范围规则。
Python对变量是局部变量还是全局变量进行了有根据的猜测。 它假定在函数中赋值的任何变量都是本地的。
因此,要为函数中的全局变量赋值,必须首先使用全局语句。
语句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
The dir( ) Function
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__是模块的名称, __name__是加载模块的文件名。
globals()和locals()函数
globals()和locals()函数可用于返回全局和本地名称空间中的名称,具体取决于调用它们的位置。
如果从函数内调用locals(),它将返回可从该函数本地访问的所有名称。
如果从函数内调用globals(),它将返回可以从该函数全局访问的所有名称。
这两个函数的返回类型是字典。 因此,可以使用keys()函数提取名称。
The reload() Function
将模块导入脚本时,模块顶层部分的代码只执行一次。
因此,如果要重新执行模块中的顶级代码,可以使用reload()函数。 reload()函数再次导入先前导入的模块。 reload()函数的语法是这样的 -
reload(module_name)
这里, module_name是要重新加载的模块的名称,而不是包含模块名称的字符串。 例如,要重新加载hello模块,请执行以下操作 -
reload(hello)
Python中的包
包是一个分层文件目录结构,它定义了一个由模块,子包和子子包组成的Python应用程序环境,依此类推。
考虑Phone目录中可用的文件Pots.py 此文件包含以下源代码行 -
#!/usr/bin/python
def Pots():
print "I'm Pots Phone"
类似地,我们有另外两个文件具有与上面相同名称的不同功能 -
具有Phone/Isdn.py功能的Phone/Isdn.py文件
具有功能G3()的Phone/G3.py文件
现在,在Phone目录中再创建一个__init__.py文件 -
- Phone/__init__.py
要在导入Phone时使所有功能可用,您需要在__init__.py中输入显式的import语句,如下所示 -
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类,然后您可以从这些类中创建包。