加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

终于学会Python?别闹了,本文中的对象你搞懂了吗?

发布时间:2019-08-28 18:16:38 所属栏目:建站 来源:编程艾老师
导读:作为一名新手Python措施员,你起首必要进修的内容之一就是怎样导入模块或包。可是我留意到,那些很多年来不时行使Python的人并不是都知道Python的导入机制着实很是机动。在本文中,我们将切磋以下话题: 通例导入(regular imports) 行使from语句导入 相对

这里,我们将 sys模块导入至全局浸染域,但我们并没有行使这个模块。然后,在square_root函数中,我们将math模块导入至该函数的局部浸染域,这意味着math模块只能在square_root函数内部行使。假如我们试图在my_pow函数中行使math,会激发NameError。试着执行这个剧本,看看会产生什么。

行使局部浸染域的甜头之一,是你行使的模块也许必要很长时刻才气导入,假如是这样的话,将其放在某个不常常挪用的函数中或者越发公道,而不是直接在全局浸染域中导入。诚恳说,我险些从没有行使过局部导入,首要是由于假如模块内部处处都有导入语句,会很难判别出这样做的缘故起因和用途。按照约定,全部的导入语句都应该位于模块的顶部。

导入留意事项

在导入模块方面,有几个措施员常犯的错误。这里我们先容两个。

  • 轮回导入(circular imports)
  • 包围导入(Shadowed imports,暂且翻译为包围导入)

先来看看轮回导入。

轮回导入

假如你建设两个模块,二者彼此导入对方,那么就会呈现轮回导入。譬喻:

  1. # a.py 
  2. import b 
  3. def a_test: 
  4. print("in a_test") 
  5. b.b_test 
  6. a_test 

然后在同个文件夹中建设另一个模块,将其定名为 b.py。

  1. import a 
  2. def b_test: 
  3. print('In test_b"') 
  4. a.a_test 
  5. b_test 

假如你运行恣意一个模块,城市激发 AttributeError。这是由于这两个模块都在试图导入对方。简朴来说,模块a想要导入模块b,可是由于模块b也在试图导入模块a(这时正在执行),模块a将无法完成模块b的导入。我看过一些办理这个题目的破解要领(hack),可是一样平常来说,你应该做的是重构代码,停止产生这种环境。

包围导入

当你建设的模块与尺度库中的模块同名时,假如你导入这个模块,就会呈现包围导入。举个例子,建设一个名叫 math.py的文件,在个中写入如下代码:

  1. import math 
  2. def square_root(number): 
  3. return math.sqrt(number) 
  4. square_root(72) 

此刻打开终端,试着运行这个文件,你会获得以下回溯信息(traceback):

  1. Traceback (most recent call last): 
  2. File "math.py", line 1, in <module> 
  3. import math 
  4. File "/Users/michael/Desktop/math.py", line 6, in <module> 
  5. square_root(72) 
  6. File "/Users/michael/Desktop/math.py", line 4, in square_root 
  7. return math.sqrt(number) 
  8. AttributeError: module 'math' has no attribute 'sqrt' 

这到底是怎么回事?着实,你运行这个文件的时辰,Python表明器起首在当前运行剧本所处的的文件夹中查找名叫 math的模块。在这个例子中,表明器找到了我们正在执行的模块,试图导入它。可是我们的模块中并没有叫sqrt的函数或属性,以是就抛出了AttributeError。

总结

在本文中,我们讲了许多有关导入的内容,可是尚有部门内容没有涉及。PEP 302中先容了导入钩子(import hooks),支持实现一些很是酷的成果,好比说直接从github导入。Python尺度库中尚有一个importlib模块,值得查察进修。虽然,你还可以多看看别人写的代码,不绝发掘更多好用的妙招。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读