当前位置: 首页 > news >正文

python中package机制的两种实现方式

当执行import module时,解释器会根据下面的搜索路径,搜索module1.py文件。

1) 当前工作目录

2) PYTHONPATH中的目录

3) Python安装目录 (/usr/local/lib/python)

事实上,模块搜索是在保存在sys.path这个全局变量中的目录列表中进行搜索。

sys.path会在解释器开始执行时被初始化成包含:

1)当前工作目录

2) PYTHONPATH中的目录

3) Python安装目录 (/usr/local/lib/python)

package是模块的集合,每一个Package的根目录下面都应当有一个__init__.py 文件。当解释器发现目录下有这个文件时,他就会认为这是一个Package,而不是一个普通的目录。

我们通过下面这样的一个实例来说明

假定项目结构如下:


demo.py
MyPackage
---classOne.py
---classTwo.py
---__init__.py
       现在我们通过两种方式来实现包机制,主要区别就在于是否在__init__.py中写入模块导入语句。

1,__init__.py是一个空白文件的方式,

 demo.py内容如下:

 复制代码
from MyPackage.classOne import classOne
from MyPackage.classTwo import classTwo

if __name__ == "__main__":
    c1 = classOne()
    c1.printInfo()
    c2 = classTwo()
    c2.printInfo()
复制代码
classOne.py内容如下:

class classOne:
    def __init__(self):
        self.name = "class one"
    
    def printInfo(self):
        print("i am class One!")
 classTwo.py内容如下:

复制代码
class classTwo:
    def __init__(self):
        self.name = "class two"
    
    def printInfo(self):
        print("i am class two!")
        
复制代码
 2,如果在__init__.py中写入导入模块的语句,则上述例子可以这样来做。


其中__init__.py中内容如下:

from classOne import classOne
from classTwo import classTwo

demo.py内容如下:

复制代码
import MyPackage

if __name__ == "__main__":
    c1 = MyPackage.classOne()
    c1.printInfo()
    c2 = MyPackage.classTwo()
    c2.printInfo()
复制代码
或者demo.py也可以定义如下:

复制代码
from MyPackage import *

if __name__ == "__main__":
    c1 = classOne()
    c1.printInfo()
    c2 = classTwo()
    c2.printInfo()
复制代码



本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2010/05/07/1730027.html,如需转载请自行联系原作者

相关文章:

  • 2017年年度总结
  • 原来Intel CPU漏洞是它引起的!
  • 在全是无人车的世界里,过马路是种怎样的体验?
  • DeepMind新论文:基于变分方法的自编码生成对抗网络
  • document.getElementByName() 获取值得问题
  • Python3虚拟环境--venv
  • 管理控制文件 和日志文件
  • Fedora 全局代理上网设置
  • Eclipse Tomcat启动后乱码
  • 设置IntelliJ主题和字体方法
  • 相机频率 条纹图片颜色还原不精确的问题,特别是指图片颜色过渡不自然的现象...
  • Git学习-Git时光机之版本回退(二)
  • linux 资料
  • 前后端分离实践
  • dedecms 联动checkbox多选
  • [Vue CLI 3] 配置解析之 css.extract
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 0基础学习移动端适配
  • Apache Spark Streaming 使用实例
  • exports和module.exports
  • github从入门到放弃(1)
  • JavaScript学习总结——原型
  • Java小白进阶笔记(3)-初级面向对象
  • Mac转Windows的拯救指南
  • mysql 5.6 原生Online DDL解析
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Redis在Web项目中的应用与实践
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 给第三方使用接口的 URL 签名实现
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 力扣(LeetCode)357
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 问题之ssh中Host key verification failed的解决
  • 我是如何设计 Upload 上传组件的
  • 线上 python http server profile 实践
  • 线性表及其算法(java实现)
  • 用element的upload组件实现多图片上传和压缩
  • 自定义函数
  • UI设计初学者应该如何入门?
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​卜东波研究员:高观点下的少儿计算思维
  • #include到底该写在哪
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (算法二)滑动窗口
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .NET学习教程二——.net基础定义+VS常用设置
  • [Hive] CTE 通用表达式 WITH关键字
  • [iOS]Win8下iTunes无法连接iPhone版本的解决方法
  • [Java基础] Java中List.remove报错UnsupportedOperationException
  • [LeetCode]-225. 用队列实现栈-232. 用栈实现队列