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

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

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

打开终端, cd至my_package包地址的文件夹,但不要进入my_package。在这个文件夹下运行Python表明器。我行使的是IPython,由于它的自动补全成果很是利便:

  1. In [1]: import my_package 
  2. In [2]: my_package.subpackage1.module_x 
  3. Out[2]: <module 'my_package.subpackage1.module_x' from 'my_package/subpackage1/module_x.py'> 
  4. In [3]: my_package.subpackage1.module_x.main 
  5. spam spam spam 

相对导入合用于你最终要放入包中的代码。假如你编写了许多相干性强的代码,那么应该回收这种导入方法。你会发明PyPI上有许多风行的包也是回收了相对导入。还要留意一点,假如你想要超过多个文件层级举办导入,只必要行使多个句点即可。不外,PEP 328提议相对导入的层级不要高出两层。

还要留意一点,假如你往 module_x.py文件中添加了if__name__==‘__main__’,然后试图运行这个文件,你会遇到一个很难领略的错误。编辑一下文件,试试看吧!

  1. from . module_y import spam as ham 
  2. def main: 
  3. ham 
  4. if __name__ == '__main__': 
  5. # This won't work! 
  6. main 

此刻从终端进入 subpackage1文件夹,执行以下呼吁:

  1. python module_x.py 

假如你行使的是Python 2,你应该会看到下面的错误信息:

  1. Traceback (most recent call last): 
  2. File "module_x.py", line 1, in <module> 
  3. from . module_y import spam as ham 
  4. ValueError: Attempted relative import in non-package 

假如你行使的是Python 3,错误信息或许是这样的:

  1. Traceback (most recent call last): 
  2. File "module_x.py", line 1, in <module> 
  3. from . module_y import spam as ham 
  4. SystemError: Parent module '' not loaded, cannot perform relative import 

这指的是, module_x.py是某个包中的一个模块,而你试图以剧本模式执行,可是这种模式不支持相对导入。

假如你想在本身的代码中行使这个模块,那么你必需将其添加至Python的导入检索路径(import search path)。最简朴的做法如下:

  1. import sys 
  2. sys.path.append('/path/to/folder/containing/my_package') 
  3. import my_package 

留意,你必要添加的是 my_package的上一层文件夹路径,而不是my_package自己。缘故起因是my_package就是我们想要行使的包,以是假如你添加它的路径,那么将无法行使这个包。

我们接下来谈谈可选导入。

可选导入(Optional imports)

假如你但愿优先行使某个模块或包,可是同时也想在没有这个模块或包的环境下有备选,你就可以行使可选导入这种方法。这样做可以导入支持某个软件的多种版本可能实现机能晋升。以github2包中的代码为例:

  1. try: 
  2. # For Python 3 
  3. from http.client import responses 
  4. except ImportError: # For Python 2.5-2.7 
  5. try: 
  6. from httplib import responses # NOQA 
  7. except ImportError: # For Python 2.4 
  8. from BaseHTTPServer import BaseHTTPRequestHandler as _BHRH 
  9. responses = dict([(k, v[0]) for k, v in _BHRH.responses.items]) 

lxml包也有行使可选导入方法:

  1. try: 
  2. from urlparse import urljoin 
  3. from urllib2 import urlopen 
  4. except ImportError: 
  5. # Python 3 
  6. from urllib.parse import urljoin 
  7. from urllib.request import urlopen 

正如以上示例所示,可选导入的行使很常见,是一个值得把握的能力。

局部导入

当你在局部浸染域中导入模块时,你执行的就是局部导入。假如你在Python剧本文件的顶部导入一个模块,那么你就是在将该模块导入至全局浸染域,这意味着之后的任何函数或要领都也许会见该模块。譬喻:

  1. import sys # global scope 
  2. def square_root(a): 
  3. # This import is into the square_root functions local scope 
  4. import math 
  5. return math.sqrt(a) 
  6. def my_pow(base_num, power): 
  7. return math.pow(base_num, power) 
  8. if __name__ == '__main__': 
  9. print(square_root(49)) 
  10. print(my_pow(2, 3)) 

(编辑:湖南网)

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

热点阅读