模块是带有python代码的文件。代码可以采用变量,函数或定义的类的形式。文件名成为模块名称。
例如,如果文件名是demo.py,则模块名称将是demo。借助模块功能,您可以将代码分成不同的文件,而无需将所有内容写入一个文件中。
Python导入模块
文件被视为python中的模块。要使用该模块,您必须使用import关键字将其导入。通过导入模块,文件中存在的函数或变量可以在另一个文件中使用。此功能可用于其他语言,例如typescript,JavaScript,java,ruby等。
如何在Python中创建和导入模块?
现在,我们将创建一个模块并将其导入另一个文件。
这是创建和导入模块的流程,如下图所示:
请按照给出的步骤在python中创建模块。
文件夹结构如下:
test.py display.py
执行display.py时,将获得以下输出:
欢迎光临
用Python导入类
之前,我们已经看到了一个带有功能的简单模块。这里将创建一个类,并在另一个文件中引用该类。
测试代码的文件夹结构如下:
Car.py display.py
使用以下代码创建一个名为Car.py的文件:
class Car: brand_name = "BMW" model = "Z4" manu_year = "2020" def __init__(self, brand_name, model, manu_year): self.brand_name = brand_name self.model = model self.manu_year = manu_year def car_details(self): print(self.brand_name," 牌汽车") print("型号是 ", self.model) print(self.manu_year, " 年生产") return "" def get_car_brand(self): print("汽车品牌是:", self.brand_name) return "" def get_car_model(self): print("汽车型号是: ", self.model) return ""
在文件Car.py中,有属性brand_name,model和manu_year。在类内部定义的函数是car_details,get_Car_brand,get_Car_model。
现在让我们将Car.py用作另一个名为display.py的文件中的模块。
import Car car_det = Car.Car("BMW", "Z5", 2020) print(car_det.brand_name) print(car_det.car_details()) print(car_det.get_car_brand()) print(car_det.get_car_model())
output:
BMW BMW 牌汽车 型号是 Z5 2020 年生产 汽车品牌是: BMW 汽车型号是: Z5
使用from导入模块
您只能导入模块的一小部分,即仅导入模块中所需的功能和变量名,而不是导入完整的代码。
当您只想导入特定内容时,可以使用“ from”关键字来导入想要的内容。
语法:
from module import your function_name , variables,... etc.
目录结构:
test.py display.py
在test.py中,有2个函数,如下所示:
def display_message(): return "欢迎访问IC知识库" def display_message1(): return "IC 集成电路与芯片设计开放社区"
现在,需要display_message函数。可以直接访问要导入的函数或变量,如下所示:
display.py代码
from test import display_message print(display_message())
output:
欢迎访问IC知识库
现在,如果使用了函数display_message1,它将引发错误,提示该函数未定义
从模块导入所有内容
导入允许您通过使用导入后跟模块名称(即要使用的文件名或库)来导入完整的模块。
语法:
import module
test.py代码
my_name = "IC知识库" my_address = "北京通州" def display_message(): return "欢迎访问IC知识库" def display_message1(): return "IC 集成电路与芯片设计开放社区"
使用导入模块
仅使用导入模块名称来引用模块内部的变量和函数,它必须以模块名称作为前缀。
例子
display.py文件
import test print(test.display_message()) print(test.display_message1()) print(test.my_name) print(test.my_address)
模块名称测试用于引用模块测试中的功能和变量。
ouput:
欢迎访问IC知识库 IC 集成电路与芯片设计开放社区 IC知识库 北京通州
使用 import*
让我们来看一个使用import *的示例。使用import *,可以直接访问函数和变量,如下例所示:
from test import * print(display_message()) print(display_message1()) print(my_name) print(my_address)
output:
欢迎访问IC知识库 IC 集成电路与芯片设计开放社区 IC知识库 北京通州
dir()函数
dir是python中的内置函数。dir返回所有属性和方法,包括给定对象的内置属性。 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息。
dir 语法:
dir([object])
参数说明:
- object — 对象、变量、类型。
返回值:
返回模块的属性列表。
示例:
import Car class_contents = dir(Car) print(class_contents)
output:
[‘Car’, ‘__builtins__’, ‘__cached__’, ‘__doc__’, ‘__file__’, ‘__loader__’, ‘__name__’, ‘__package__’, ‘__spec__’]
您也可以尝试在Python中提供的内置模块上使用dir()。让我们在json模块上尝试相同的方法,如下例所示。它将显示json模块中可用的所有属性和方法。
import json json_details = dir(json) print(json_details)
output:
['JSONDecodeError', 'JSONDecoder', 'JSONEncoder', '__all__', '__author__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', '_default_decoder', '_default_encoder', 'codecs', 'decoder', 'detect_encoding', 'dump', 'dumps', 'encoder', 'load', 'loads', 'scanner']
Package
包是一个目录,其中定义了所有模块。为了使Python解释器将其视为包,您的目录应具有init.py文件。init.py将目录打包。这是我们要处理的程序包的布局。
要使用package,请创建一个名为package /的目录。在目录内,创建一个名为__init__.py的空文件。再创建3个文件module1.py,module2.py和module3.py,并定义功能,如图所示。以下是module1.py,module2.py和module3.py的详细信息
module1.py
def mod1_func1(): print("Welcome to Module1 function1") def mod1_func2(): print("Welcome to Module1 function2") def mod1_func3(): print("Welcome to Module1 function3")
module2.py
def mod2_func1(): print("Welcome to Module2 function1") def mod2_func2(): print("Welcome to Module2 function2") def mod2_func3(): print("Welcome to Module2 function3")
module3.py
def mod3_func1(): print("Welcome to Module3 function1") def mod3_func2(): print("Welcome to Module3 function2") def mod3_func3(): print("Welcome to Module3 function3")
准备好后,您可以在任何文件内调用包,如下所示:test.py:
在这里,导入了mypackage.module1,并为其指定了别名mod1。同样,您可以从我的包中使用其他模块module2.py和module3.py。
import mypackage.module1 as mod1 print(mod1.mod1_func1()) print(mod1.mod1_func2()) print(mod1.mod1_func2())
Output:
Welcome to Module1 function1 None Welcome to Module1 function2 None Welcome to Module1 function2 None
我们刚刚用一个简单的模块演示了该程序包,其中包含函数。根据您的项目,您还可以打包带有sub-packages。子文件夹/具有定义了类的模块。
Python模块路径搜索
在执行期间,当python遇到import module name时,解释器将尝试定位该模块。它在内置模块列表中搜索模块。稍后,将在sys.path中定义目录。
综上所述,解释器进行以下搜索以找到模块:
- 在当前目录中。
- 在内置模块列表中
- 在sys.path目录中
您可以通过导入sys模块并打印sys.path来获取sys.path的详细信息。它会为您提供目录列表,如下所示:
import sys print(sys.path)
输出:
['C:\\Users\\Administrator\\PycharmProjects\\firstProject', 'C:\\Users\\Administrator\\PycharmProjects\\firstProject', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python38\\python38.zip', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python38\\DLLs', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python38\\lib', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python38', 'C:\\Users\\Administrator\\AppData\\Roaming\\Python\\Python38\\site-packages', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages']
您还可以根据需要修改路径并保留目录。
使用模块别名
您也可以通过为其指定别名来将模块名称转换为较短的形式。可以使用关键字来完成别名。
语法:
import filename as alias name
例子:
import test as t print(t.display_message()) print(t.display_message1()) print(t.my_name) print(t.my_address)
Python 绝对导入与相对导入
您现在知道了如何将文件作为模块导入另一个文件中。现在让我们看看如何管理文件夹中的可用文件。可以使用绝对导入或相对导入来导入文件夹中的文件。
项目文件夹结构如下所示:
根文件夹是我的项目/。它具有两个子文件夹package1和package2。
文件夹package1有两个模块,module1.py和module2.py。
文件夹package2具有一个类myclass.py,带有module3.py的子包subpkg和最后一个module4.py。
- 在module1.py中,有一个名为myfunc1的函数。
- 在module2.py中,有一个名为myfunc2的函数。
- 在module3.py中,有一个名为myfunc3的函数。
- 在module4.py中,有一个名为myfunc4的函数。
使用绝对导入
对于绝对导入,您需要直接在项目根文件夹中添加模块的完整路径。
现在让我们看看如何使用绝对导入来引用每个模块中存在的功能。
要使用功能myfunc1,您需要导入如下:
from package1.module1 import myfunc1 or from package1 import module1 module1.myfunc1()
要使用功能myfunc3,您需要导入如下:
from package1.subpkg.module3 import myfunc3 or from package1.subpkg import module3 module3.myfunc3()
使用绝对导入的优点和缺点
使用绝对导入的优点如下:
- 追溯模块进行代码检查变得很容易。
- 易于使用,非常简单。
- 如果将项目移到其他路径,则导入仍将保持不变。
使用绝对导入的缺点
这是使用绝对导入的缺点:
缺点:
- 导入路径可能很长,以防万一,模块是嵌套的,并且模块的名称很长。
使用相对导入
考虑以下相同的文件夹结构,我们将看到如何使用相对导入来导入相同的文件夹。
在相对导入中,要导入的模块相对于当前位置,即存在导入语句的位置。
语法:
在相对导入中,使用from导入时,需要在模块名称前添加句点(.)。
如果模块位于当前位置的上一层,它将在模块名称之前2个句点(..)。
参考上面提到的文件夹结构图,我们具有以下模块及其功能,我们需要参考这些模块。
- 在module1.py中,有一个名为myfunc1的函数。
- 在module2.py中,有一个名为myfunc2的函数。
- 在module3.py中,有一个名为myfunc3的函数。
- 在module4.py中,有一个名为myfunc4的函数。
要使用函数myfunc1,您将需要如下导入:
from .module1 import myfunc1
要使用功能myfunc3,您需要导入如下:
from .subpkg.module3 import myfunc3
相对导入的优势
好处:
- 使用相对导入很容易。
- 从当前位置开始,与绝对进口相比,代码可以缩短。
缺点:
- 使用相对导入,很难追溯代码所在的位置