跳到主要内容

Python 中的模块

模块怎么使用?

在 Python 中,模块是一种组织代码的方式,用于将相关的函数、类和变量组织在一起,以便在不同的程序中重复使用。模块提供了一种将代码逻辑分离和封装的方法,使代码更可维护、可重用和易于理解。

下面是使用 Python 模块的一般步骤:

1、导入模块:

在使用模块之前,需要使用 import 语句将其导入到你的代码中。导入模块可以使用以下几种方式:

import module_name  # 导入整个模块
from module_name import function_name # 从模块中导入特定的函数
from module_name import * # 导入模块中的所有内容(不推荐使用)

2、使用模块中的函数、类和变量: 一旦导入模块,你就可以使用其中定义的函数、类和变量。使用的方式取决于导入模块的方式。

import math

result = math.sqrt(16) # 使用math模块中的sqrt函数计算平方根
print(result) # 输出:4.0

from random import randint

random_number = randint(1, 10) # 使用random模块中的randint函数生成一个随机整数
print(random_number) # 输出:随机的整数

3、创建自己的模块: 除了使用现有的模块外,你还可以创建自己的模块。创建模块的方法是将相关的函数、类和变量定义在一个.py文件中,并确保该文件与你的代码文件在同一个目录下。然后,你可以使用 import 语句导入自己的模块并使用其中的内容。

例如,假设你创建了一个名为 my_module.py 的模块,并在其中定义了一个名为 greet() 的函数:

# my_module.py
def greet(name):
print(f"Hello, {name}!")

然后,你可以在另一个文件中导入并使用 my_module 模块:

import my_module
my_module.greet("Alice") # 输出:Hello, Alice!

主模块和非主模块

在Python中,每个Python脚本文件都可以作为一个模块。模块是一种组织和重用代码的方式,可以将相关的功能封装在一个文件中,然后在其他地方导入并使用这些功能。Python中有两种类型的模块:主模块(main module)和非主模块(non-main module)。

  1. 主模块(Main Module)

    • 主模块是你在命令行或脚本中直接运行的Python文件。
    • 主模块通常包含程序的入口点,即脚本的起始点,从这里开始执行。
    • 主模块的名称是 __main__,这是Python用来标识主模块的特殊名称。
    • 当你在终端中运行一个Python脚本时,该脚本将被视为主模块。

    示例:如果你运行一个名为 my_script.py 的Python脚本,my_script.py 就是主模块。

  2. 非主模块(Non-Main Module)

    • 非主模块是被其他模块导入并重用的模块。
    • 这些模块通常包含一些函数、类或变量,供其他模块引用和使用。
    • 非主模块的名称是其文件名(不包括扩展名),并且可以通过导入来访问。

    示例:如果在主模块中导入一个名为 my_module.py 的模块,那么 my_module.py 就是非主模块。

例如,考虑以下的示例:

# my_module.py
def greet(name):
return f"Hello, {name}!"

# main.py
import my_module

if __name__ == "__main__":
result = my_module.greet("Alice")
print(result)

在这个示例中,my_module.py 是一个非主模块,包含了 greet 函数。而 main.py 是主模块,它导入了 my_module 并使用了其中的函数。当你运行 main.py 时,它是主模块,而 my_module.py 是非主模块。

总之,Python 中的主模块是程序的入口点,而非主模块是被导入和重用的模块。非主模块的功能可以通过导入来在其他地方访问和使用。

只导入所需的类或函数

Python 提供了一种更具针对性的导入方法,只导入需要的内容,而不是整个模块。

以下是这种导入方式的一般结构:

from module_name import item1, item2, ...

其中,module_name 是要导入内容的模块的名称,item1, item2, ... 是要从模块中导入的具体项的名称,可以是类、函数或变量。

这种方式的优点是:

  1. 可以直接使用导入的项的名称,无需在代码中使用模块名作为前缀。
  2. 减少代码中的重复性,提高可读性。
  3. 减少了命名冲突的可能性,特别是当导入的项名称与当前代码中的其他项名称冲突时。

下面是一个具体的例子,假设有一个名为 math_operations 的模块,其中定义了一些数学操作的函数:

# math_operations.py
def add(x, y):
return x + y

def subtract(x, y):
return x - y

def multiply(x, y):
return x * y

现在,如果只需要导入 addsubtract 两个函数,可以使用 from ... import ... 形式进行导入:

from math_operations import add, subtract

result = add(5, 3)
print(result) # 输出:8

result = subtract(7, 2)
print(result) # 输出:5

在上面的例子中,我们只导入了 math_operations 模块中的 addsubtract 两个函数,并直接使用它们的名称进行函数调用,而无需使用模块名作为前缀。

这种导入方式使得代码更加简洁、可读性更强,并且避免了潜在的命名冲突。

模块使用例子

# 命名为 mymodule.py
def greeting(name):
print("Hello, " + name)


# 调用这个模块
import mymodule

mymodule.greeting("Bill")


# 因为默认使用的是就是模块名,所以可以给其取一个简单的别名
import mymodule as mx

a = mx.person1["age"]
print(a)

# 打印模块里的所有函数(使用 dir 函数)
import platform

x = dir(platform)
print(x)


# 以使用 from 关键字选择仅从模块导入部件
# 命名为 mymodule.py
def greeting(name):
print("Hello, " + name)

person1 = {
"name": "Bill",
"age": 63,
"country": "USA"
}

from mymodule import person1
print (person1["age"])

# 在使用 from 关键字导入时,请勿在引用模块中的元素时使用模块名称
# person1["age"],而不是 mymodule.person1["age"]。

__init__.py 文件

在大多数情况下,__init__.py文件可以完全为空。这个文件的存在本身就是一个标记,告诉 Python 解释器该目录应该被视为一个 Python 包。这允许你从该包中导入模块。

然而,__init__.py文件也可以包含Python代码,这些代码在导入包中的模块时会被执行。这为包提供了几种便利的用途:

初始化代码

你可以在__init__.py中放置任何当包被导入时你希望执行的代码。这可能包括包初始化所需的配置设置或者初始化逻辑。

包的内容定义

__init__.py可以用来定义包对外提供的接口,通过在文件中指定__all__变量来控制from package import *时应该导入哪些模块:

__all__ = ["module1", "module2", "module3"]

方便的导入

你可以在__init__.py文件中导入包内的模块,这样做可以让包的使用者更方便地访问这些模块,而不需要使用完整的包路径:

from .module1 import Class1
from .module2 import function2

这意味着包的使用者可以直接使用from package import Class1,而不是from package.module1 import Class1

封装

__init__.py还可以用来封装包的内部结构,使得包的实现细节对使用者透明。你可以只暴露需要公开的类和函数,而将包的内部结构隐藏起来。

示例

假设你有一个名为 utils 的包,里面有一个 cookies_manager.py 模块,你想要在导入 utils 时就能直接使用 CookiesManager 类,你可以在 utils__init__.py 中这样写:

from .cookies_manager import CookiesManager

这样,使用者就可以通过 from utils import CookiesManager 来导入 CookiesManager 类,而不需要指定模块名。