设为首页 收藏本站
查看: 839|回复: 0

[经验分享] 从C#到Python —— 5 模块和包

[复制链接]

尚未签到

发表于 2015-4-20 10:52:59 | 显示全部楼层 |阅读模式
  
  本章是《从C#到Python》系列连载的最后一章,内容较简单,主要介绍Python中模块与包的使用方法。如果你对这部分内容已经比较熟悉,就不要再浪费时间看了,写这一章只是为了整个系列完整而已,没什么新的东西(本章内容主要参考了《Python精要参考》的第八章《模块和包》)。
  

5.1  模块
  Python的脚本都是用扩展名为py的文本文件保存的,一个脚本可以单独运行,也可以导入另一个脚本中运行。当脚本被导入运行时,我们将其称为模块(module)。模块是Python组织代码的基本方式。
  模块名与脚本的文件名相同,例如我们编写了一个名为Items.py的脚本,则可在另外一个脚本中用import Items语句来导入它。在导入时,Python解释器会先在脚本当前目录下查找,如果没有则在sys.path包含的路径中查找。
  在导入模块时,Python会做以下三件事:
(1) 为模块文件中定义的对象创建一个名字空间,通过这个名字空间可以访问到模块中定义的函数及变量;
(2) 在新创建的名字空间里执行模块文件;
(3) 创建一个名为模块文件的对象,该对象引用模块的名字空间,这样就可以通过这个对象访问模块中的函数及变量,如:




1 import sys
2  print sys.path
  如果要同时导入多个模块,可以用逗号分隔,如: import sys, os ;
  可以使用as关键字来改变模块的引用对象名,如:import os as system ;
  也可以用from语句将模块中的对象直接导入到当前的名字空间(不创建模块名字空间的引用对象),如:from socket import gethostname ;
  from语句支持逗号分割的对象,也可以使用星号(*)代表模块中除下划线开头的所有对象,如:from socket import *,这是个懒省事的方法,我是经常用,不过用之前最好先搞清楚会不会覆盖当前名字空间中的函数名等,总之不是个好习惯:)
  除了Python脚本(不仅限于py,还包括pyc和pyo),import语句还可以导入C或C++扩展(已编译为共享库或DLL文件)、包(包含多个模块,一会介绍)和内建模块(使用C编写并已链接到Python解释器内)。不过除了包,另外两个我也没用过:(
  Python解释器在第一次import一个py文件的时候,会尝试将其编译为字节码文件,这个文件的扩展名通常为.pyc,它是已经完成语法检查并转译为虚拟机指令的代码。后边的导入操作会直接读取.pyc文件而不是.py文件,一般而言速度会更快。
  

5.2  包
  Python的模块可以按目录组织为包(package)。一般来说,我们将多个关系密切的模块组织成一个包,以便于维护和使用,同时可有效避免名字空间冲突。创建一个包的步骤是:建立一个名字为包名字的文件夹,并在该文件夹下创建一个__init__.py文件,你可以根据需要在该文件夹下存放脚本文件、已编译扩展及子包。
  一个典型的包可能有以下结构:




1 package1/
2     __init__.py
3     subPack1/
4         __init__.py
5         module_11.py
6         module_12.py
7         module_13.py
8     subPack2/
9         __init__.py
10         module_21.py
11         module_22.py
12     ……
  只要目录下存在__init__.py,就表明此目录应被作为一个package处理。在最简单的例子中,__init__.py 是一个空文件,不过一般我们都要在__init__.py中做一些包的初始化动作,或是设定一些变量。
  最常用的变量是__all__。当使用包的人在用from pack import * 语句导入的时候,系统会查找目录pack下的__init__.py文件中的__all__这个变量。__all__是一个list,包含了所有应该被导入的模块名称,例如:__all__ = ["m1", "m2", "m3"] 表示当from pack import * 时会import 这三个module。
  如果没有定义__all__,from pack import * 不会保证所有的子模块被导入。所以要么通过__init.py__,要么显式地import 以保证子模块被导入,如:import pack.m1,  pack.m2,  pack.m3。
  

5.3  本章小结
  本章介绍了Python中模块与包的使用方法,要点如下:
  (1) 模块是一个可以导入的Python脚本文件;
(2) 包是一堆按目录组织的模块和子包,目录下的__init__.py文件存放了包的信息;
(3) 可以用import, import as , form import 等语句导入模块和包。
  总之,模块与包是在物理上组织Python代码复用的一种有效方式,它有点类似于C#中的程序集(Assembly)。初学Python不一定要会自己建立模块和包,但一定要学会使用各种包,这正是Python的强大之处:Python带着各种各样的battery。当你想完成一项功能时,最好先去搜索是不是有相关的包能够复用(多数情况下是这样的,因为在各种领域都有太多的人在为Python作着贡献)。而且,绝大多数Python包都是开源的,研读优秀的代码也是提高编程能力的一种有效途径。
  

进一步阅读的参考:
  《从C#到Python》系列连载到今天就全部写完了,非常感谢各位的支持、鼓励以及批评,使我能够不断完善和提高。读完这个连载,在Python的语法上应该够应付一阵了,当然结合具体的应用领域,还是有很多东西需要不断学习,在此向大家推荐一些有用的读物:
  [1] 科学计算方面:这个是我的应用Python的主阵地,推荐HYRY Studio的《用Python做科学计算》(见http://pyscin.appspot.com/html/index.html),我个人认为非常优秀的一本原创著作(这么好的书不知为何不正式出版,钦佩作者的rp !)。
  [2] GUI开发方面:如果你用wxPython,那么肯定要看《wxPython in Action》(中文版见http://wiki.woodpecker.org.cn/moin/WxPythonInAction);而我个人主要用PyQt4,这方面值得推荐的读物是柴树杉翻译的《PyQt4 编程简介》(见http://pyqt-doc-cn.googlecode.com/svn/trunk/Introduction_to_PyQT4/doc/r54/index.html)。如果英文好,还是推荐看《Rapid GUI Programming with Python and Qt》(英文pdf版下载地址:http://householdcommandmodule.googlecode.com/files/Rapid.GUI.Programming.with.Python.and.Qt.Oct.2007.pdf)。
  [3] Web开发方面:这个我还没有涉及,Django的资料网上也是大把了,其它的Python Web开发框架也是多如牛毛,自己找找吧:)
  [4] 移动开发方面:最近准备用PyS60做点小东西,不过一直抽不出时间来,下载了《PyS60 Library Reference》(中文版地址:http://www.woodpecker.org.cn:9081/doc/Python/_PDF/PythonForS60_1_4_1_CN_doc.pdf),一直没时间看呢,所以不好推荐,不过官方的东西应该是差不了的。另外园子里Lucker的blog上有一些关于PyS60开发的不错文章,我虽收藏了,但也是一直没时间详细看,呵呵,以后再说了。
  
最后声明:虽然写的不咋地,不过好歹也是花了我很多时间和心血的,所以希望转载的朋友请注明出处!
  
  连载完

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-58727-1-1.html 上篇帖子: Python开发编码规范(转) 下篇帖子: Python进制转换(二进制、十进制和十六进制)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表