跳转至

模块和包

模块

Python**模块是一个包含有函数、变量、类和常量等等内容的python文件**。模块帮助我们将相关的代码组织在一起,例如math模块拥有数学相关的函数。

创建模块

创建一个名为mymodule.py的新文件,并写入下面的代码:

foo = 100

def hello():
    print("i am from mymodule.py")

在这个文件中,我们定义了一个全部变量foo和一个名为hello()的方法。现在我们可以使用import关键词来引入这个模块,并使用mymodule.py中的变量和函数:

import mymodule

print(mymodule.foo)
mymodule.hello()

上述代码的运行结果如下:

100
i am from mymodule.py

如之前代码所示,调用模块的变量和函数时,需要指定模块的名称。

导入模块

当我们使用import声明导入模块时,模块中的所有内容都被导入到当前文件中。如果我们只需要模块中的个别内容时该如何操作呢?使用from关键词,就可以达到这样的目的,比如:

from mymodule import foo
print(foo)

上述代码的运行结果为100。

当使用from improt 语句导入特定内容后,访问这些内容就不需要再使用模块名了。

包中含有多个子包时,可以使用绝对导入引用兄弟包中的子模块。例如,要在模块 sound.filters.vocoder 中使用 sound.effects 包的 echo 模块时,可以用 from sound.effects import echo 导入。

还可以用 import 语句的 from module import name 形式执行相对导入。这些导入语句使用前导句点表示相对导入中的当前包和父包。例如,相对于 surround 模块,可以使用:

from . import echo
from .. import formats
from ..filters import equalizer

注意,相对导入基于当前模块名。因为主模块名是 "__main__" ,所以 Python 程序的主模块必须始终使用绝对导入。

导入类时,也可为其指定别名。例如,要在程序中创建大量电动汽车实例,需要反复输入ElectricCar,非常烦琐。为避免这种烦恼,可在import语句中给ElectricCar指定一个别名:

from electric_car import ElectricCar as EC

现在每当需要创建电动汽车实例时,都可使用这个别名:

my_tesla = EC('tesla', 'roadster', 2019)

一开始应让代码结构尽可能简单。先尽可能在一个文件中完成所有的工作,确定一切都能正确运行后,再将类移到独立的模块中。

导入内部模块的三种情况

同级目录下的调用

程序结构如下:

-- src
    |-- mod1.py
    |-- test1.py

若在程序test1.py中导入模块mod1, 则直接使用

import mod1

# 或者

from mod1 import *
调用子目录下的模块

程序结构如下:

-- src
    |-- mod1.py
    |-- lib
    |    |-- mod2.py
         |-- test1.py

这时看到test1.pylib目录(即mod2.py的父级目录),如果想在程序test1.py中导入模块mod2.py ,可以在lib件夹中建立空文件__init__.py文件(也可以在该文件中自定义输出模块接口),然后使用:

from lib import mod2  
  
import lib.mod2
调用上级目录下的文件

程序结构如下:

-- src
    |-- mod1.py
    |-- lib
        |    |-- mod2.py
    |-- sub
        |    |-- test2.py

这里想要实现test2.py调用mod1.pymod2.py ,做法是我们先跳到src目录下面,直接可以调用mod1,然后在lib上当下建一个空文件__init__.py ,就可以像第二步调用子目录下的模块一样,通过from lib import mod2进行调用了。具体代码如下:

import sys,os
sys.path.append(os.getcwd())
import mod1
from lib import mod2

使用dir函数查看模块内容

内置的 dir() 函数能够返回由对象所定义的名称列表。 如果这一对象是一个模块,则该列表会包括函数内所定义的函数、类与变量。

该函数接受参数。 如果参数是模块名称,函数将返回这一指定模块的名称列表。 如果没有提供参数,函数将返回当前模块的名称列表。

>>> import sys

# 给出 sys 模块中的属性名称
>>> dir(sys)
['__displayhook__', '__doc__',
'argv', 'builtin_module_names',
'version', 'version_info']
# only few entries shown here

# 给出当前模块的属性名称
>>> dir()
['__builtins__', '__doc__',
'__name__', '__package__']

# 创建一个新的变量 'a'
>>> a = 5

>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'a']

包是指一个包含模块与一个特殊的 __init__.py 文件的文件夹,后者向 Python 表明这一文件夹是特别的,因为其包含了 Python 模块。

假设你想创建一个名为“world”的包,其中还包含着 "asia"、"africa"等其它子包,同时这些子包都包含了诸如"india"、"madagascar"等模块。下面是你会构建出的文件夹的结构:

- <some folder present in the sys.path>/
    - world/
        - __init__.py
        - asia/
            - __init__.py
            - india/
                - __init__.py
                - foo.py
        - africa/
            - __init__.py
            - madagascar/
                - __init__.py
                - bar.py

包是一种能够方便地分层组织模块的方式。

Python中的库(library)是借用其他编程语言的概念,没有特别具体的定义,严格来说Python中是没有库的概念。大多数情况下,人们认为库着重强调其功能性。在Python中,具有某些功能的模块和包都可以被称作库。 模块有诸多函数组成,包由诸多模块机构化组成,库中也可以包含包、模块和函数。

参考文献

  1. PyPI · The Python Package Index
  2. Glossary — Python 3.10.5 documentation

最后更新: 2022年10月15日 01:02:48
创建日期: 2021年9月12日 05:55:32
Contributers: yangjh