- 简介
- 深入模块
- __name__属性
- dir() 函数
- 包
通过python解释器编写程序固然可以,但如果退出再进入,那么之前定义的变量方法就不复存在了,
但是我们可以通过将这些变量方法存放在文件中,为一些脚本或者是交互式的解释器使用,这个文件被称为模块。其中包含了所有定义的函数和变量,后缀名是py,各位读者可以通过本文深入认识模块的属性和方法。
模块除了方法定义,还包罗了可执行代码,这些代码用来初始化模块,不过只会在初次导入的时候才会执行。
每个模块都有自己的独立的符号表,在模块内部可以当做全局符号表来使用。所以在开发时可以放心使用这些全局变量而不必担心混淆。
其他模块也能够导入到当前模块,通常来讲是通过import语句来实现,如下所示:
我们首先定义一个test2.py:
def fib(n): # 定义到 n 的斐波那契数列
a, b = 0, 1
while b < n:
print(b, end=' ')
a, b = b, a+b
print()
def fib2(n): # 返回到 n 的斐波那契数列
result = []
a, b = 0, 1
while b < n:
result.append(b)
a, b = b, a+b
return result
然后在test中引用:
from test2 import fib, fib2 print(fib(500))
这种导入方法不会吧导入的模块名存储在当前字符表中。如果需要的话,可以使用以下方法一次性将模块中的所有名称导入到当前模块:
from test2 import *
但是请注意,这种方法引入的名字中不包括单一下划线开头的名字,大多数情况下,不建议开发者使用者这种方法命名。
__name__属性当一个模块被另一个程序初次引用的时候,它的主程序将会运行。如果想让某一个代码块不在运行范围内,通常会使用__name__属性让这个程序块在仅自身运行时执行。
#在test.py中
if __name__ == '__main__':
print('程序自身在运行')
else:
print('我来自另一模块')
import test #在test2中
各位读者可以关注文件的区别。
还有需要注意的是:每个模块都有__name__属性,当值是__main__的时候,表示自身在运行。
__name__的前后是两条下划线
这个内置函数可以找到模块里所有定义的名称,并以字符串形式返回。
如下所示:
import test2 print(dir(test2))包
python中命名模块空间的形式。采用点模块名称形式,例如A.B表示包A的子模块B。
就好像使用模块的时候,你不用担心不同模块之间的全局变量相互影响一样,采用点模块名称这种形式也不用担心不同库之间的模块重名的情况。
这样不同的作者都可以提供 NumPy 模块,或者是 Python 图形库。
这里给出了一种可能的包结构(在分层的文件系统中):
sound/ 顶层包
__init__.py 初始化 sound 包
formats/ 文件格式转换子包
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/ 声音效果子包
__init__.py
echo.py
surround.py
reverse.py
...
filters/ filters 子包
__init__.py
equalizer.py
vocoder.py
karaoke.py
...
开发者也可以导入一个包里面的特定模块:
import sound.effects.echo
或者这样:
from sound.effects import echo
通常不主张使用*符号导入模块,这样会导致可读性降低,虽然省去一些功夫,但是仍有一些包被设计成只能通过国特定方法导入。



