Menu Close

Python 模块

模块是带有python代码的文件。代码可以采用变量,函数或定义的类的形式。文件名成为模块名称。

例如,如果文件名是demo.py,则模块名称将是demo。借助模块功能,您可以将代码分成不同的文件,而无需将所有内容写入一个文件中。

Python导入模块

文件被视为python中的模块。要使用该模块,您必须使用import关键字将其导入。通过导入模块,文件中存在的函数或变量可以在另一个文件中使用。此功能可用于其他语言,例如typescript,JavaScript,java,ruby等。

如何在Python中创建和导入模块?

现在,我们将创建一个模块并将其导入另一个文件。

这是创建和导入模块的流程,如下图所示:

%title插图%num

请按照给出的步骤在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将目录打包。这是我们要处理的程序包的布局。

%title插图%num

要使用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中定义目录。

综上所述,解释器进行以下搜索以找到模块:

  1. 在当前目录中。
  2. 在内置模块列表中
  3. 在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  绝对导入与相对导入

您现在知道了如何将文件作为模块导入另一个文件中。现在让我们看看如何管理文件夹中的可用文件。可以使用绝对导入或相对导入来导入文件夹中的文件。

项目文件夹结构如下所示:

%title插图%num

根文件夹是我的项目/。它具有两个子文件夹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

相对导入的优势

好处:

  • 使用相对导入很容易。
  • 从当前位置开始,与绝对进口相比,代码可以缩短。

缺点:

  • 使用相对导入,很难追溯代码所在的位置

 

python系列教程目录

Posted in Python

发表评论

相关链接