摘要:在本教程中,你将学习有关 Python 模块的知识、如何从模块中导入对象,以及如何开发自己的模块。
Python 模块简介
模块是具有特定功能的软件片段,Python 模块是一个包含 Python 代码的文件。
例如,在构建购物车应用程序时,你可以有一个用于计算价格的模块,另一个用于管理购物车中商品的模块。每个模块都是一个独立的 Python 源代码文件。
模块的名称由文件名(去掉 .py
扩展名)指定。例如,如果你有一个名为 pricing.py
的文件,那么模块名就是 pricing
。
编写 Python 模块
首先,创建一个名为 pricing.py
的新文件,并添加以下代码:
# pricing.py
def get_net_price(price, tax_rate, discount=0):
discounted_price = price * (1 - discount)
net_price = discounted_price * (1 + tax_rate)
return net_price
def get_tax(price, tax_rate=0):
return price * tax_rate
pricing
模块包含两个函数,这两个函数可以根据售价、税率和折扣来计算净价和税额。
导入模块对象
若要在另一个文件中使用模块中定义的对象,可以使用 import
语句。
import
语句有多种形式,我们将在接下来的部分中进行讨论。
import <module_name>
若要使用模块中定义的对象,需要使用以下 import
语句导入该模块:
import module_name
例如,若要在 main.py
文件中使用 pricing
模块,可使用以下语句:
import pricing
导入模块时,Python 会执行对应文件中的所有代码。在此示例中,Python 会执行 pricing.py
文件中的代码。此外,Python 还会将模块名添加到当前模块中。
该模块名允许你在当前模块中访问导入模块中的函数、变量等。
例如,你可以使用以下语法调用导入模块中定义的函数:
module_name.function_name()
以下展示了如何在 main.py
文件中使用 pricing
模块中定义的 get_net_price()
函数:
# main.py
import pricing
net_price = pricing.get_net_price(
price=100,
tax_rate=0.01
)
print(net_price)
输出:
101.0
import <module_name> as new_name
如果你不想在 main.py
中使用 pricing
作为标识符,你可以将模块名重命名为其他名称,如下所示:
import pricing as selling_price
然后你可以在 main.py
中用重命名后的模块名selling_price
作为标识符:
net_price = selling_price.get_net_price(
price=100,
tax_rate=0.01
)
from <module_name> import <name>
如果你想在引用模块中的对象时不加模块名前缀,可以使用以下语法显式导入它们:
from module_name import fn1, fn2
现在,你可以像这样使用导入的函数,而无需指定模块名:
fn1()
fn2()
这个示例从 pricing
模块中导入了 get_net_price()
函数:
# main.py
from pricing import get_net_price
并使用 pricing
模块中的 get_net_price()
函数:
# main.py
from pricing import get_net_price
net_price = get_net_price(price=100, tax_rate=0.01)
print(net_price)
可以使用以下导入语句将导入的名称重命名为另一个名称:
from <module_name> import <name> as <new_name>
以下示例将 pricing
模块中的 get_net_price()
函数重命名为 calculate_net_price()
函数:
from <module_name> import *
:从模块中导入所有对象
要导入模块中的所有对象,可以使用以下语法:
from module_name import *
此 import
语句会将模块中的所有公有标识符(包括变量、常量、函数、类等)导入到程序中。
然而,这并不是一个好的做法,因为如果导入的模块中存在相同的对象,那么第二个模块中的对象会覆盖第一个模块中的对象,这可能会导致程序无法按照预期运行。
让我们来看下面的示例。
首先,创建一个名为 product.py
的新文件,并定义 get_tax()
函数:
# product.py
def get_tax(price):
return price * 0.1
product
模块和 pricing
模块都包含 get_tax()
函数。不过product
模块中的 get_tax()
函数只有一个参数,而 pricing
模块中的 get_tax()
函数有两个参数。
其次,从 pricing
模块和 product
模块中导入所有对象,并使用 get_tax()
函数:
from pricing import *
from product import *
tax = get_tax(100)
print(tax)
由于 product
模块中的 get_tax()
函数覆盖了 pricing
模块中的 get_tax()
函数,因此你得到的税额值为 10。
总结
模块是一个扩展名为
.py
的 Python 源代码文件。模块名是去掉扩展名后的 Python 文件名。
要使用模块中的对象,可以使用
import
语句导入它们。