一、什么是Module?

一个python Module就是一个模块,本质就是一个.py文件,其中包含了python对象的定义和python语句。

在模块内部,模块名存储在全局变量__name__中,可以直接在Module中用__name__变量的到模块名。

module是为了我们能够重复使用一些对象,比如类、函数,而将这些对象定义放在一个.py文件(module)中,或是将一个较大的工程分解为多个.py文件,易于维护。

1. 模块的定义和引入

例如,我们现在写一个模块,名字为:fibo.py:

 print("__name__", __name__) //语句

 def fib(n): //函数定义
a, b = 0, 1
result = [] print("in fib()", __name__) while(b<n):
result.append(b)
a, b = b, a+b
print(result)

如果我们在另一个文件:testModule.py中直接导入这个Module

 import fibo

结果是:

/Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 /Users/lesley/PycharmProjects/test/fibo.py
__name__ __main__ Process finished with exit code 0

也就是说:这个module的语句被执行了,但是其中所定义的函数并没有执行。如果我们想要运行其中定义的函数,则需要import 这个module中的函数,例如

 from fibo import fib
fib(10)

结果是:

/Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 /Users/lesley/PycharmProjects/test/testModule.py
__name__ fibo
in fib() fibo
[1, 1, 2, 3, 5, 8] Process finished with exit code 0

2. Module的加载

每个Module中都包含对象的定义和一些语句,这些语句是用来初始化Module的,这些语句会在这个Module第一次被import的时候执行,多次import也只会执行一次,当这个Module被作为一个Script来运行时也会被执行。

两种import方式:

  • import module_name1[as name1], module_name2[as name2]
  • from module_name import item1[as name1], item2[as name2]

3.Module搜索路径

当在testModule.py运行时,遇到需要import这个名为fibo的Module时,Python Interpreter 首先会在built-in Module中找有没有叫这个名字的,如果没有,则会从一系列的目录去寻找这个Module,这些目录都存在sys.path中。

built-in Module是Python的标准库,主要提供了了很重要的但是Python没有提供的功能(例如:sys module)

sys.path:是python的搜索模块的路径集,是一个list ,它的初始值是

  1. 当前目录,也就是当前执行脚本的目录
  2. 环境变量PYTHONPATH中存储的值
  3. Python包的安装目录,例如:/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages

可以在命令行中查看:

可以在python 环境下使用sys.path.append(path)添加相关的路径,但在退出python环境后自己添加的路径就会自动消失!

例如,我们要添加fibo.py所在的路径:/Users/lesley/Downloads 进sys.path,则可以修改代码:“

import sys
sys.append("/Users/lesley/Downloads/")

因为这个这时暂时的,所以更永久的方式是将fibo.py复制到python包的安装目录:/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages

4. 把module作为Script来执行(if __name__ == "__main__")

Mudule可以直接执行也可以被调用,当自己直接执行时,解释器会把__name__设置为__main__,而被调用执行时,也就是作为参数传递给Interpret时,__name__的值为自己的模块名,所以我们可以在一个模块代码的最后写一个 if __name__ == "__main__",以用来测试、调试这个Module,而当外界需要调用这个模块的时候,就不会执行其中的代码

 print ("__name__ :", __name__)
def fib(n):
a, b = 0, 1
result = []
print ("in fib() :", __name__)
while (b<n):
result.append(b)
a, b = b, a+b
print(result) if __name__ == "__main__":
import sys
fib(int(10))

执行的结果:

5. dir()——built-in函数的目录

6. 模块包(package)

Package可以理解为组织起来的Module的一个层次结构,也就是一个目录。它包含了sub-package或者是Module。

要让解释器将一个目录看作是一个Package,也就是加入到sys.path下面,则该目录下必须要有一个__init__.py文件。

这个__init__.py文件可以为空,也可以用来做初始化工作,以及设置__all__变量。

二. 测试项目中的结构更新

当我们写完了测试用例test_CustomerLogin,并将其放在testcase目录下的时候,如果直接在run_test引入该测试用例(import test_CustomerLogin),运行时会报错: 提示找不到该文件。这时我们需要做两件事情:

1. 在testcase目录下创建一个__init__.py文件,文件内容可以为空

2. 在run_test.py中添加两行代码:

 import sys
sys.path.append("\testcase")

即:将\testcase目录添加到sys.path下

三. __init__.py文件解析

首先,我们先了解,python在执行import语句时,执行的操作:

第 1 步:创建一个新的、空的module(模块、组件)对象(它可能包含多个module)

第 2 步:把这个新建的module插入到sys.module中

第 3 步:装载module对象(如果需要,首先必须编译)

  • 首先找到module程序所在的位置,

    • 搜索顺序:当前路径(以及从当前目录指定的sys.path)——PYTHONPATH——python的安装设置相关的默认路径
    • 所以,如果当前路径或PYTHONPATH中存在与标准module同样的module,则会覆盖标准module。例如,如果当前目录下存在xml.py,在在执行import xml时,导入的是当前目录下的Module,而不是系统标准的xml

第 4 步:执行新的mudule中对应的代码

我们将testcase目录添加到系统path下,run_test就可以正常调用其目录下所有的测试用例。

而__init__.py就是标志该目录是可以用的包。该文件中可以有内容,当我们在导入这个python包的时候,实际上就是导入了它的__init__文件

Module、__init__.py 文件解析的更多相关文章

  1. Python自定义Module中__init__.py文件介绍

    ./pyModuleTest/├── addutil│   ├── add.py│   ├── add.pyc│   ├── __init__.py│   ├── __init__.pyc│   └─ ...

  2. Python模块包中__init__.py文件的作用

    转载自:http://hi.baidu.com/tjuer/item/ba37ac4ce7482a0f6dc2f08b 模块包: 包通常总是一个目录,目录下为首的一个文件便是 __init__.py. ...

  3. python中__init__.py文件的作用

    问题 在执行models.py时,报ImportError:No module named transwarp.db的错误,但明明transwarp下就有db.py文件,路径也没有错误.真是想不通.后 ...

  4. python2中的__init__.py文件的作用

    python2中的__init__.py文件的作用: 1.python的每个模块的包中,都必须有一个__init__.py文件,有了这个文件,我们才能导入这个目录下的module. 2.__init_ ...

  5. Python __init__.py文件的作用

    我们经常在python的模块目录中会看到 "__init__.py"  这个文件,那么它到底有什么作用呢? 1. 模块包(module package)标识 如果你是使用pytho ...

  6. Python __init__.py 文件使用

    __init__.py的主要作用是: 1. Python中package的标识,不能删除 2. 定义__all__用来模糊导入 3. 编写Python代码(不建议在__init__中写python模块 ...

  7. 关于python 的空的__init__.py文件的作用,可不可以删除,到底有没有用?

    0.声明,本篇只讨论空__init__.py文件的情况,不顾前提非得说__init__.py文件里面也可以写东西的不在此讨论了范围之内,重点是个"空"字. 1.很多地方的文件夹都有 ...

  8. Python模块包(pycharm右键创建文件夹和python package的区别)中__init__.py文件的作用

    在eclipse中用pydev开发Python脚本时,我遇到了一个这样的现象,当我新建一个pydev package时,总会自动地生成一个空的__init__.py文件,因为是python新手,所以很 ...

  9. 初学者:__init__.py文件的作用

    __init__.py 文件的作用及意义 __init__.py文件是一个包必须的文件,即使它是空的,但也是必须的,如果没有这个文件,python将不会把该文件夹当做一个package,而仅仅是一个d ...

随机推荐

  1. spring AOP Capability and Goals(面向方面编程功能和目标归纳)

    原官方文档链接: https://docs.spring.io/spring/docs/5.1.6.RELEASE/spring-framework-reference/core.html#aop-i ...

  2. python2文件转换为exe可执行文件

    windows下py文件的运行需要安装python,如果是exe文件就可以直接运行 1. 直接在命令行用pip安装 pyinstaller pip install pyinstaller 2 在命令行 ...

  3. cf1037E. Trips(图论 set)

    题意 题目链接 Sol 倒着考虑!倒着考虑!倒着考虑! 显然,一个能成为答案的子图一定满足,其中任意节点的度数\(>= k\) 那么倒着维护就只用考虑删除操作,如果一个点不合法的话就把它删掉,然 ...

  4. ElementUI组件库常见方法及问题汇总(持续更新)

    本文主要介绍在使用ElementUI组件库的时候,常遇见的问题及使用到的方法,汇总记录便于查找. 1.表单 阻止表单的默认提交 <!-- @submit.native.prevent --> ...

  5. JS原生隐藏显示图片,点击切换图片的效果

    今天要说的内容,看标题就都能知道了!所有知识点一览无遗啊!咱们今天的东西,是纯纯的原生JS代码, 我先说一下要求, 1.有两个按钮,内容为显示,和换, 2.当点击显示的时候,按钮文字变成隐藏,同时图片 ...

  6. Bootstrap + AngularJS+ Ashx + SQL Server/MySQL

    去年年底12月,为适应移动端浏览需求,花了1个月时间学习Bootstrap,并将公司ASP网站重构成ASP.NET. 当时采取的网站架构: Bootstrap + jQuery + Ashx + SQ ...

  7. 各种优化方法总结比较(sgd/momentum/Nesterov/adagrad/adadelta)

    前言 这里讨论的优化问题指的是,给定目标函数f(x),我们需要找到一组参数x,使得f(x)的值最小. 本文以下内容假设读者已经了解机器学习基本知识,和梯度下降的原理. SGD SGD指stochast ...

  8. 01_NIO基本概念

    [NIO的几个概念] Buffer(缓冲区) Channel(通道,管道) Selector(选择器,多路复用器) [Buffer] Buffer是一个对象,它包括一些要写入或者要读取的数据.在NIO ...

  9. 【Anaconda】windows安装报错:UnicodeDecodeError解决方法

    UnicodeDecodeError: 'utf8' codec can't decode byte 0xce in position 11: invalid continuation byte 解决 ...

  10. android之键盘转载

    显示键盘: EditText editText.setFocusable(true); editText.setFocusableInTouchMode(true); editText.request ...