龙空技术网

python中的模块和包

编程皮皮糖 108

前言:

目前看官们对“python程序的文件扩展名为”可能比较关心,各位老铁们都想要剖析一些“python程序的文件扩展名为”的相关文章。那么小编在网上搜集了一些有关“python程序的文件扩展名为””的相关文章,希望兄弟们能喜欢,你们一起来学习一下吧!

import datetimeprint(datetime.datetime.now())

上面是一段打印当前时间的代码,初学者常常对import datetime这句不大理解。只知道在这里导入了一个叫datetime的模块。那到底什么是模块呢?

所谓模块实质上就是一个python源代码文件,扩展名是.py。我们之所以要导入这个文件,是因为有一些功能已经在其他文件中实现了,我们只需要导入并调用就可以,无需再去重新实现,说白了就是为了省事。上面代码中涉及的datetime模块(.py扩展名省略)中有一个datetime对象,该对象有一个方法叫now() 能返回当前时间,因此在这里我们首先就导入了这个模块。至于这个datetime模块是谁写的,如何实现的,其实你大可不必去关心,反正不是你写的,会用就行了,哈哈!毕竟人生苦短,快用模块啊!

我们可以做一个有趣的实验来增强对模块导入的理解。

1、首先在程序文件s1.py文件中写入如下代码:

def test(name):    print("I am in ",name)test("S1")

2、同路径下,有一个s2.py程序文件。我们如果需要在s2.py中调用s1.py已经实现的函数test,那么应该这样写:

import s1s1.test("S2")

3、运行s2.py后,你就可以看到如下输出。

的确,我们已经成功调用了test函数,但问题是怎么会输出两行信息呢?

这就说明在import s1 时,实际上是运行了一次s1程序。因此如果是纯粹提供调用的模块文件,我们是要避免这种情况出现的,在这里s1.py可以修改成这样:

def test(name):    print("I am in ",name)if __name__=="__main__":    test("S1")

把执行代码写到判断语句之下,这么做的好处是:1、如果直接运行s1.py文件,功能不受影响 2、s2.py在调用s1模块时,不执行s1中的执行代码。

你可以尝试分别运行s1.py和s2.py去看下效果。

4、我们把s2.py修改成这样:

import s1test("S2")

再次运行它,出错了吧!为什么呢?

这是因为为了避免模块导入时,模块中的函数、对象等和现在的程序中的函数、对象等同名,从而发生冲突,python在导入s1模块时自动为它生成了命名空间(namespace)s1,调用模块中的函数和对象时都必须注明命名空间。

当然有些网友肯定会嫌这么干麻烦,其实你如果确信能解决冲突问题,代码还可以这么修改:

from s1 import testtest("S2")

运行后发现一点问题没有。当然假如s2中已经包含一个名字叫test的函数怎么办?我们可以考虑各导入的名字重新改个名字。

from s1 import test as tttt("S2")

总之,记住了 import 之后可以是模块名也可以是具体的功能或对象名;而且如果是具体功能或对象名,我们还可以考虑给他重命名。

说到模块,其实不得不提到包的概念。为了便于在程序中进行管理,常常把一些文件按功能进行划分,并放到不同的文件夹下,这时候如果直接向上面这么写就会出错。

比如我们在s2.py同路径下建立一个文件夹app,然后把s1.py移入;再次运行s2.py。

出错了吧!原因就是:程序找不到s1模块了。所以这时候我们必须指明s1模块在哪个文件夹下,这个文件夹其实在python中就叫做“包”。我们把s2.py代码修改下试试:

from app import s1s1.test("S2")

当然,也可以改成这样,知道为什么吗?

from app.s1 import testtest("S2")

接下来我们继续实验,我们在app下再添加一个文件s3.py,代码如下所示:

def hello():    print("hello world")

很显然我们可以在s2.py中调用到s3.py中的hello,相信你一定可以做到!也可以这么修改s2.py

from app import *s1.test("S2")s3.hello()

这表示一次性导入了包app中所有的模块,当然也可以写成:from app import s1,s2

实际中我们常常用*一次性导入所有模块,这种情况下如果app包的开发者不需要让别人调用s3中的功能(可能他感觉没有必要,或者不合适),也就是向调用者隐藏起s3.py该怎么做呢?

这时候就需要在包app中添加一个文件__init__.py,其代码如下:

__all__=['s1']

我们再次执行s2.py,发现出现问题了,找不到s3了。

如果我们在__init__.py中加入一行代码,如下所示:

__all__=['s1']print("i am in __init__")

回到s2.py,去掉出错语句,然后执行之,发现什么了?

这说明我们在执行from app import *时,实际上自动运行了包中的__init__.py,因此这个文件常作为包的初始化准备之用。

好了,今天关于python中的模块和包就讲这么多了,有问题和建议的请给我留言!

标签: #python程序的文件扩展名为