跳转到内容

Python 入门教程/导入模块

来自维基教科书,开放的书籍,开放的世界

上一课我们学习了关于类的重要概念。正如你所记得的,类是变量和函数的组合,在一个整洁的包中。编程术语称之为封装,但无论它被称为什么,它都是一个非常酷的功能,可以将事物组合在一起,以便代码可以在许多地方的许多实例中使用。当然,你必须问,“如何将我的类放到许多地方,在许多程序中?”。答案是将它们放到一个模块中,以便导入到其他程序中。

模块?什么是模块?

[编辑 | 编辑源代码]

一个模块是一个 Python 文件,它(通常)只包含变量、函数和类的定义。例如,一个模块可能看起来像这样

代码示例 1 - moduletest.py
### EXAMPLE PYTHON MODULE
# Define some variables:
numberone = 1
ageofqueen = 78

# define some functions
def printhello():
    print("hello")
    
def timesfour(input):
    print(input * 4)
    
# define a class
class Piano:
    def __init__(self):
        self.type = input("What type of piano? ")
        self.height = input("What height (in feet)? ")
        self.price = input("How much did it cost? ")
        self.age = input("How old is it (in years)? ")
	
    def printdetails(self):
        print(f'This piano's height is {self.height} foot')
        print(self.type, "piano, " + self.age, "years old and costing\
 " + self.price + " dollars.")

正如你所看到的,一个模块看起来很像你的普通 Python 程序。

那么我们用模块做什么呢?我们将它的部分(或全部)导入到其他程序中。

为了将 moduletest.py 中的所有变量、函数和类导入到你正在编写的另一个程序中,我们使用 import 运算符。例如,要将 moduletest.py 导入到你的主程序中,你将使用以下代码

代码示例 2 - mainprogram.py
### mainprogam.py
### IMPORTS ANOTHER MODULE
import moduletest

这假设该模块与 mainprogram.py 位于同一个目录中,或者是一个 Python 自带的默认模块。你在文件名末尾省略了 '.py' - 它会被忽略。你通常将所有 import 语句放在 Python 文件的开头,但从技术上讲,它们可以放在任何地方。为了在你的主程序中使用模块中的项目,你使用以下代码

代码示例 3 - mainprogram.py 继续
### USING AN IMPORTED MODULE
# Use the form modulename.itemname
# Examples:
print(moduletest.ageofqueen)
cfcpiano = moduletest.Piano()
cfcpiano.printdetails()

正如你所看到的,你导入的模块的行为与我们上一课中学习的类非常相似 - 模块内部的任何内容都必须以 modulename 开头才能工作。

更多关于模块的信息

[编辑 | 编辑源代码]

希望你能摆脱必须在从模块中使用的每个项目之前添加的 modulename 部分?不可能?永远不会?好吧,我无论如何都要教你。

避免这种麻烦的一种方法是只从模块中导入想要的对象。为此,你使用 from 运算符。你以 from modulename import itemname 的形式使用它。以下是一个示例

代码示例 4 - 导入单个对象
### IMPORT ITEMS DIRECTLY INTO YOUR PROGRAM

# import them
from moduletest import ageofqueen
from moduletest import printhello

# now try using them
print(ageofqueen)
printhello()

这样做有什么意义呢?好吧,也许你可以用它来使你的代码更易读。如果我们在模块中嵌套了许多模块,它还可以消除额外的隐藏层。

如果你愿意,你可以使用 from modulename import * 以这种方式从模块中导入所有内容。当然,如果你的程序中存在与模块中某些项目同名的对象,这可能会带来麻烦。对于大型模块来说,这种情况很容易发生,并且会导致很多头痛。更好的方法是使用普通方式导入模块(不使用 from 运算符),然后将项目分配给一个本地名称

代码示例 5 - mainprogram.py 继续
### ASSIGNING ITEMS TO A LOCAL NAME

# Assigning to a local name
timesfour = moduletest.timesfour

# Using the local name
print(timesfour(565))

这样,你可以消除一些隐藏层,并且可以拥有来自特定模块的所有项目。

华夏公益教科书