Python - 模块

模块允许您逻辑地组织Python代码.将相关代码分组到模块中使代码更易于理解和使用.模块是一个Python对象,具有可以绑定和引用的任意命名属性.

简单地说,模块是一个由Python代码组成的文件.模块可以定义函数,类和变量.模块还可以包含可运行代码.

示例

名为 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 Statement

Python的 from 语句允许您将模块中的特定属性导入当前命名空间. from ... import 具有以下语法 :

from modname import name1[, name2[, ... nameN]]

例如,要从模块fib导入函数fibonacci,请使用以下语句 :

from fib import fibonacci

此语句不会将整个模块fib导入当前命名空间;它只是将模块fib中的项目fibonacci引入导入模块的全局符号表.

from ... import * Statement

还可以使用以下import语句 :

 from modname import *

这提供了一种将模块中的所有项目导入当前命名空间的简便方法;谨慎使用此语句.

定位模块

导入模块时,Python解释器按以下顺序搜索模块 :

  • 当前目录.

  • 如果找不到该模块,Python随后会搜索shell变量PYTHONPATH中的每个目录.

  • 如果所有其他方法都失败,Python会检查默认路径.在UNIX上,此默认路径通常为/usr/local/lib/python/.

模块搜索路径存储在系统中module sys作为 sys.path 变量. 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对变量是局部变量还是全局变量进行了有根据的猜测.它假定在函数中赋值的任何变量都是本地的.

因此,为了给函数中的全局变量赋值,必须首先使用全局语句./p>

语句 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()构建 - in函数返回包含模块定义的名称的字符串的排序列表.

该列表包含模块中定义的所有模块,变量和函数的名称.以下是一个简单的示例 :

#!/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应用程序环境-subpackages,等等.

考虑 Phone 目录中的文件 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后,您可以使用所有这些类e当你导入手机套餐时.

#!/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类,然后您可以从这些类中创建包.