余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

Python编程:如何导入包/模块中的函数和/或类?

xiyangw 2023-10-09 16:12 11 浏览 0 评论

前言

我们前面一系列文章,较详细的介绍函数。随着所掌握的Python知识越来越丰富,我们会编写更多的函数,并分门别类的存放在不同的包和模块中,以便复用。为了复用函数对象,就需要导入到需要的文件模块中。本文就来简单介绍如何调用其它模块的函数。结合代码示例以便更好地理解和应用。

Python外部导入模式

说明:这里所说的导入(import),适用于包/模块中的函数和类对象的导入——包括内置模块、第三方和自定义的模块相关对象。

绝对导入

截至目前,我们已经了解了很多关于函数的知识,接下来看看如何使用它们。编写函数的全部意义在于以后能够重用它们,在Python中,此种需要就转换为将它们导入到需要它们的名称空间中。将对象导入命名空间有许多不同的方法,最常见的方法是import module_name和from module_name import function_name。当然,这些都是非常简单的例子,稍作解释:

  • ? import module_name形式要找到module_name模块,并在本地命名空间中为它定义一个名称,以便import语句在本地命名空间中执行。
  • ? from module_name import identifier形式比这个稍微复杂一点,但基本上做的是相同的事情。它查找module_name并搜索一个属性(或子模块),并在本地命名空间中存储对标识符(identifier)的引用。

这两种形式都可以使用as子句来更改导入对象的名称,例如:

from mymodule import myfunc as better_named_func

为了让你了解导入是什么样子的,这里有一个来自Fabrizio项目中的一个测试模块的示例(注意,导入块之间的空行遵循PEP 8上的指导方针https://www.python.org/dev/peps/pep-0008/#imports:标准库、第三方和本地代码):

# 导入模块函数
from datetime import datetime, timezone # 同一行导入两个
from unittest.mock import patch # 但个导入
import pytest # 第三方库
from core.models import ( # 多个导入
   Exam,
   Exercise,
   Solution,
)

当我们有一个从项目根开始的文件结构时,可以使用点表示法来获得我们想要导入到当前命名空间的对象,它可以是包、模块、类、函数或其他任何东西。

from module import还允许一个catch-all(导入所有)子句,即from module import *,用于将模块中的所有名称一次性获取到当前命名空间中。但这样是不好的(不推荐),原因有与性能有关的风险和名称相互冲突等。你可以在官方Python文档中阅读关于导入的所有知识,但是在结束这个主题之前,来看一个更好的示例。

假设我们已经在lib文件夹中的funcdef.py模块中定义了两个函数,square(n)和cube(n)。我们希望在两个与lib文件夹处于同一级别的模块中使用它们,分别为func_import.py和func_from .py。显示该项目的树形结构如下所示:

在我们给大家展示各个模块的代码之前,请大家记住,为了让Python把它(lib)看做是一个包(package),我们需要在其中放入一个__init__.py模块文件(该模块文件可以是个空文件,啥内容都没有)。

提示:

关于__init__.py文件有两点需要注意。首先,它是一个完整意义上的Python模块,因此你可以像使用其他模块一样将代码放入其中。其次,从Python 3.3开始,将文件夹解释为Python包,它的存在不再是必须的。

示例代码如下:

# 包模块:lib/funcdef.py
def square(n):
    return n ** 2

def cube(n):
    return n ** 3

# 导入方式:importExam01.py
import lib.funcdef

print(lib.funcdef.square(10))
print(lib.funcdef.cube(10))

# 导入方式:importExam02.py
from lib.funcdef import square, cube

print(square(10))
print(cube(10))

这两个文件在执行时都打印100和1000。如上所见,根据在当前作用域中导入的方式和内容,我们所访问的square和cube函数的方式有很大不同。

相对导入

到目前为止,我们看到的导入类型被称为绝对导入。也就是说,它定义了我们想要导入的模块或我们想要导入对象的模块的整个路径。还有另一种将对象导入Python的方法,称为相对导入相对导入是通过在模块前面添加与我们需要回溯的文件夹数量相同的前导圆点(.)来完成的,以便能找到我们所要搜索的内容。简单地说,它是这样的:

from .mymodule import myfunc

在重组项目时,相对导入非常有用。在导入中没有完整的路径,就允许开发人员在不需要重命名太多路径的情况下移动内容。

有关相对导入的完整说明,请参阅PEP 328:https://www.python.org/dev/peps/pep-0328/

在后面的章节中,我们将使用不同的库创建项目,并使用几种不同类型的导入(包括相对导入),因此请确保您花一点时间阅读官方Python文档中的相关内容。

本文小结

本文介绍了导入如何导入外部的对象(包括Python内置的、第三方的以及自定义的),无论是导入类还是函数,其导入模式雷同,另外,导入时还可以根据需要取个别名。

就简要点地写这些了,下次见。记得点赞 + 关注@传新视界,分享给更多的朋友看到,谢谢。

相关推荐

华为交换机配置命令总结

1、配置文件相关命令[Quidway]displaycurrent-configuration显示当前生效的配置[Quidway]displaysaved-configuration显示fla...

解决账户无法登录的故障
解决账户无法登录的故障

在优化系统时错误地根据网上的提示,将唯一的Administrator账户设置为禁用,导致重启后无法进入系统。类似的故障还有使用组策略限制本地账户登录,导致重启后...

2023-10-11 17:16 xiyangw

S5720交换机登录提示初始密码存在安全风险
S5720交换机登录提示初始密码存在安全风险

问题描述客户每次登录输密码时,提示初始密码不安全,现在客户嫌麻烦想要去掉:Username:huaweiPassword:Warning:Theinitia...

2023-10-11 17:15 xiyangw

Springboot,Mybatis修改登录用户的密码
Springboot,Mybatis修改登录用户的密码

一、Mybatis.xml<updateid="changePassword"parameterType="string...

2023-10-11 17:15 xiyangw

PHP理论知识之沐浴更衣重看PHP基础(二)
PHP理论知识之沐浴更衣重看PHP基础(二)

接上篇,咱们继续讲解PHP基础八、标准PHP组件和框架的数量很多,随之产生的问题就是:单独开发的框架没有考虑到与其他框架的通信。这样对开发者和框架本身都是不利的...

2023-10-11 17:15 xiyangw

新鲜出炉UCloud云主机“数据方舟”评测报告(5)— — 关其城
新鲜出炉UCloud云主机“数据方舟”评测报告(5)— — 关其城

2015年10月29日,UCloud云主机黑科技——“数据方舟”功能正式上线,首轮内测随即开放。截止至2015年12月6日,我们共收到了534位用户的评测申...

2023-10-11 17:14 xiyangw

业余无线电Q简语及英文缩语
业余无线电Q简语及英文缩语

Q简语:语音通信及CW通信通用(加粗为常用)QRA电台何台QRB电台间之距离QRG告之正确频率QRH频率是否变动QRI发送音调QRJ能否收到QRK信号之可...

2023-10-11 17:14 xiyangw

非常详细!如何理解表格存储的多版本、生命周期和有效版本偏差
非常详细!如何理解表格存储的多版本、生命周期和有效版本偏差

表格存储在8月份推出了容量型实例,直接支持了表级别最大版本号和生命周期,高性能实例也将会在9月中旬支持这两个特性。那么,最大版本号和生命周期以及特有的...

2023-10-11 17:14 xiyangw

H3C交换机恢复出厂和各种基本配置,这20个要点你知道吗?
H3C交换机恢复出厂和各种基本配置,这20个要点你知道吗?

私信“干货”二字,即可领取138G伺服与机器人专属及电控资料!H3C交换机不知道密码如何恢复出厂设置1、开机启动,Ctrl+B进入bootrom菜单,选择恢复出...

2023-10-11 17:13 xiyangw

在使用移动支付系统的时候如何保护信息安全?

移动支付的方式近年来不断被更新,使得Venmo(据嘉丰瑞德理财师了解,此为美国的“支付宝”)之类的支付方式已经可以某种意义上代替随身携带现金了。但是你必须防范那些第三方应用程序轻松地获取你的银行卡以及...

界面控件DevExpress WinForms MVVM入门指南——登录表单(下)

从本文档中,您将了解如何向应用程序添加登录表单。在本节教程中着重讨论了如何实现此任务,这基本上是附加应用程序功能的一部分。DevExpressUniversalSubscription官方最新版免...

linux基础命令(一)
linux基础命令(一)

为啥要学linux?您可能熟悉WindowsXP、Windows7、Windows10和MacOSX等操作系统。Linux就是这样一种强大的操...

2023-10-11 17:13 xiyangw

MySQL数据库密码忘记了,怎么办?

#头条创作挑战赛#MySQL数据库密码忘记了且没有其他可以修改账号密码的账户时怎么办呢?登录MySQL,密码输入错误/*密码错误,报如下错误*/[root@TESTDB~]#mysql-u...

MobaXterm忘记Session密码,如何查看已保存的密码
MobaXterm忘记Session密码,如何查看已保存的密码

MobaXterm工具登录过SSH终端后,如果存储了Session(存储后再连接ssh的时候只需要输入账号不需要输入密码就可以直接连接上ssh),则可以...

2023-10-11 17:12 xiyangw

华为交换机密码丢失修改方法
华为交换机密码丢失修改方法

华为S2300交换机找回密码设置一、目的交换机的console和telnet密码丢失,无法登录设备。交换机已进行过数据配置,要把密码恢复而数据配置不能丢失。二、...

2023-10-11 17:12 xiyangw

取消回复欢迎 发表评论: