当前位置: 首页 > 文档资料 > Python 中文教程 >

Modules

优质
小牛编辑
126浏览
2023-12-01

模块允许您逻辑地组织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 namespaceglobal 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类,然后您可以从这些类中创建包。