在编写python程序的过程中,不可避免的需要自定义一些python的类和函数。有时候定义的函数太多,就要根据用途放到不同的module(模块)中去,项目更大时,需要将这些module再分类,放到不同的package(包)中,以方便管理。
可以这样理解,module就是*.py文件,里面定义了一些类,函数及变量,可以被其他程序调用;将不同的module整合到一个文件夹中,就得到了package,为了实现对其中的module的管理,package中往往需要有一个__init__.py文件。

1.最简单的方法:定义单个module

这种方法是最直观、最简单的,也是我目前为止使用频率最高的。在python中,每一个*.py文件都可以被其他的python程序所引用。如图1,在pycharm中我建立了一个python_module_test的项目:

现在里面只有两个文件:my_module.pyrun.py,其代码分别为:

# my_module.py
import time as tvar1 = t.time()
var2 = 'This is a long string'
var3 = 89
# run.py
from my_module import *print(var1)
print(var2)
print(var3)
print(t.time())

在python窗口运行run.py后,打印如下信息:

很明显,run.py脚本导入了my_module.py中的所有的变量(var1var2var3)及my_module.py中导入的包(t)。

2.如果module在文件夹中会如何?

上面的例子中,run.pymy_module.py在同一级目录下,调用起来没什么问题,但如果my_module.py在一个文件夹中,该如何处理呢?
更改项目结构如下:

python_module_test├──pkg│    └──my_module.py└──run.py

然后注意修改一下run.py中的第一代码行为from pkg.my_module import *
按照我在网上查的大部分资料的说法,这个时候python并不会将pkg这个目录视为包,因为其中缺少__init__.py文件。那么我们来实际运行一下吧:

这次我直接在Terminal窗口运行的python run.py命令,输出正常。那么交互式运行的结果呢?


可以看出,仍然可以运行。
这是否就说明一个package中__init__.py文件的存在与否是无关紧要的呢?显然,并不是这样的,为了说明这一点,先看一下python中有哪些导入方式。

3.python中包、模块和函数的导入方式

在上面的例子中,我们都是用的from something import *的方式进行导入模块和变量,另外的一种导入方式就是import something as sth。下面总结一下这两种导入方式的注意点,这里参考了这篇博客的内容。

  • 方式1:import pkg.subPkg.module as alias
    如果不指定alias,那么每次调用module中的变量和方法时,必须全路径调用,如pkg.subPkg.module.var1
  • 方式2.0:from pkg.subPkg import module
    这种方法可以直接调用module.var1,当然,你也可以将module另外指定一个别名,并用别名去调用;
  • 方式2.1:from pkg.subPkg.module import var1
    这种方式直接导入了模块中的指定变量(函数、类等)。

总的来看,导入语句或者为import ...的形式,或者为from ... import ...的形式。

  • 当以import ...的方式导入时,最终import的内容必须为包或者模块,而不能是类、函数或变量等定义在模块中的具体内容。例如:import A.B.C,那么A,B一定是一个package,C一定是一个package或者module。
  • 当以from ...的方式导入时,最终import的内容可以是包、模块或者类、函数、变量。例如:from A.B import C,那么A一定是一个package,B可以是package,也可以是module;C可以是package、module或者变量、函数、类等任意一种。

4.__init__.py文件的作用

from ...导入方式中,有一种不被推荐的写法就是from A import *,这可能会导致变量的冲突,但是当你十分清楚A中的所有模块(变量)时,这样做并没有什么问题。仍然以上文中的项目结构为例,在python命令框执行以下代码会报错:

这说明,python并没有将模块module.py导入到环境中去,解决的办法,就是为包pkg添加__init__.py文件,对该包中的模块等资源进行管理。修改后的项目结构如下:

python_module_test├──pkg│    ├──__init__.py  │   └──my_module.py└──run.py

其中,__init__.py的内容为:

# __init__.py
__all__=['my_module']

这时,再执行上述代码,结果如下:

这说明,__init__.py文件中的__all__参数控制该包中哪些模块(变量)可以以from pkg import *的方式导入被导入。用户也可以在__init__.py文件中定义其他的变量、类以及函数,然后将这些名字以字符串添加到__all__列表中,这样在就可以被导入到运行环境中去。

python中自定义module的方法及注意事项相关推荐

  1. Python中自定义函数的方法

    在Python编程中,可以使用已经定义好的函数,也可以自定义函数实现某些特殊的功能. 1 自定义函数的语法 在Python中,自定义函数的语法如下所示 def 函数名(参数):函数体 其中,def是关 ...

  2. python导入自定义模块_ubuntu下Python导入自定义模块的方法

    ubuntu下Python导入自定义模块的方法 当在python程序中导入自定义模块时,若出现"Import Error:no module named xxx"表明系统在pyth ...

  3. python中callable_Python abc.Callable方法代码示例

    本文整理汇总了Python中collections.abc.Callable方法的典型用法代码示例.如果您正苦于以下问题:Python abc.Callable方法的具体用法?Python abc.C ...

  4. python中的module

    Python中的Module是比较重要的概念.常见的情况是,事先写好一个.py文件,在另一个文件中需要import时,将事先写好的.py文件拷贝到当前目录,或者是在sys.path中增加事先写好的.p ...

  5. python中类方法与实例方法的区别-Python中的对象,方法,类,实例,函数用法分析...

    本文实例分析了Python中的对象,方法,类,实例,函数用法.分享给大家供大家参考.具体分析如下: Python是一个完全面向对象的语言.不仅实例是对象,类,函数,方法也都是对象. class Foo ...

  6. python使用del保留字定义一个函数-python中自定义函数的保留字是

    基本使用(推荐学习:Python视频教程)def function_name(parameters): expressions Python使用def开始函数定义,紧接着是函数名,括号内部为函数的参数 ...

  7. python中模块(Module)和包(Package)的区别 (导入模块、导入包)(import导包)

    如下结构,mycompany就是包,abc.py和xyz.py就是模块 mycompany ├─ __init__.py ├─ abc.py └─ xyz.py 参考文章:Python中模块(Modu ...

  8. python grpc 并发_在Python中使用gRPC的方法示例【h】

    本文介绍了在Python中使用gRPC的方法示例,分享给大家,具体如下: 使用Protocol Buffers的跨平台RPC系统. 安装 使用 pip gRPC由两个部分构成,grpcio 和 gRP ...

  9. python中列表的sort方法_python中列表的sort方法使用详解

    内容简介:python中列表的sort方法使用详解 一.基本形式 列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可修改的. 排序,数字.字符 ...

最新文章

  1. 百度paddle学习笔记
  2. 5大典型模型测试单机训练速度超对标框架,飞桨如何做到?
  3. 数据分析:JSON格式数据
  4. 业务知识——Logger日志打印规范
  5. linux ntp手动授时,关于我校NTP授时服务的使用说明
  6. Linux netfilter源码分析(5)
  7. Visual Studio 2010修改授权
  8. 再提手机上网应该包月计费
  9. Java 多线程执行
  10. Linux搭建Zabbix监控服务
  11. CSDN答疑:按行累加
  12. 如何避免出现SQL注入漏洞
  13. 人人商城前端小程序如何配置使用教程
  14. 第15课:JSP动作 Jsp forward动作(JSP教程 JSP入门实战教程 黄菊华Java网站开发系列教程)
  15. 阿酷三合一版_阿酷插件3.2开源版
  16. 网络视频ts格式文件下载及将其合成单一视频文件
  17. 财富提升成都IT产业吸引力
  18. Microsoft Office Home and Student Edition 2013 All-in-One For Dummies 免积分下载
  19. 中国机器人界“诺贝尔奖”!深眸科技实力斩获恰佩克年度创新品牌奖
  20. 移动硬盘坏了数据可以恢复吗 移动硬盘坏了怎么导出数据

热门文章

  1. B2B2C商城系统怎么挑选好?
  2. 安装win10时Raid模式下无法识别固态硬盘的问题
  3. html代码怎么做成链接,HTML的链接代码怎么做?HTML的图片链接怎么制作?
  4. 暴风集团高管的薪酬累加约等于退市的暴风流通市值
  5. Blurst.com
  6. 信号完整性分析心得体会_电路实验的实验心得体会
  7. Unity3d数字地球三维建筑模型、数字城市
  8. 如何在Mirth Connect中创建和调用自定义Java代码
  9. mybatis动态sql,批量插入,批量删除,模糊查询
  10. 编译安装kubernetes 1.15.3