Python之模块

310 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。

import

想要使用Python源文件,只需在另一个源文件里执行import语句。以下是简单示例:

创建support.py文件,在其中定义以下函数:

def print_func(par):
    print("Hello:", par)
    return

创建test.py文件,导入并使用:

import support

support.print_func('hf')

from ... import

Python的from语句让你从模块中导入一个指定的部分到当前命名空间中,语法如下:

把上面的test.py改下

from support import print_func

print_func('hf')

或者干脆全导入:

from support import *

print_func('hf')

__name__属性

一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用__name__属性来使该模块自身运行时执行。

创建using_name.py:

if __name__ == '__main__':
    print('程序自身在运行')
else:
    print('我来自另一模块')

执行using_name.py

(base) ➜  module git:(22-08) ✗ python3 using_name.py  
程序自身在运行

导入test.py并执行:

import using_name
(base) ➜  module git:(22-08) ✗ python3 test.py      
我来自另一模块

包是一种管理Python模块命名空间的形式,采用“点模块名称”。比如一个模块的名称是A.B,那么他表示一个包A中子模块B。

下面给出了一种可能包结构:

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
              ...

目录只有包含一个叫做__init__.py的文件才会被认作是一个包。用户可以每次只导入一个包里面的特定模块,比如:

import sound.effects.echo

使用全名去访问:

sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)

还有一种导入子模块的方法是:

from sound.effects import echo

这样就不需要冗长的前缀,可以这样:

echo.echofilter(input, output, delay=0.7, atten=4)

笔者认为这点没有java方便,直接使用文件夹的形式,如果出现同名类另外的使用全限定类名就行。go和java类似。