模块和包

Posted 韩晓飞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模块和包相关的知识,希望对你有一定的参考价值。

定义

     一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀

   使用方法: 

#spam.py
print(‘from the spam.py‘)

 

money=1000

 

def read1():
    print(‘spam->read1->money‘,money)

 

def read2():
    print(‘spam->read2 calling read‘)
    read1()

 

def change():
    global money
    money=0

1 模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入import语句时才执行(import语句是可以在程序中的任意位置使用的,且针对同一个模块很import多次,为了防止你重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载大内存中的模块对象增加了一次引用,不会重新执行模块内的语句),如下 

#test.py
import spam #只在第一次导入时才执行spam.py内代码,此处的显式效果是只打印一次‘from the spam.py‘,当然其他的顶级代码也都被执行了,只不过没有显示效果.
import spam
import spam
import spam

‘‘‘
执行结果:
from the spam.py
‘‘‘

2.2每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当做全局名称空间,这样我们在编写自己的模块时,就不用担心我们定义在自己模块中全局变量会在被导入时,与使用者的全局变量冲突

按 Ctrl+C 复制代码

3为模块名起别名,相当于m1=1;m2=m1 

1 import spam as sm
2 print(sm.money)

from ... import...

1. 对比import spam,会将源文件的名称空间‘spam‘带到当前名称空间中,使用时必须是spam.名字的方式

而from 语句相当于import,也会创建新的名称空间,但是将spam中的名字直接导入到当前的名称空间中,在当前名称空间中,直接使用名字就可以了、

 

 1 from spam import read1,read2

 

2.也支持as

3.如果当前有重名read1或者read2,那么会有覆盖效果。

#测试三:导入的函数read1,被当前位置定义的read1覆盖掉了
#test.py
from spam import read1
def read1():
    print(‘==========‘)
read1()
‘‘‘
执行结果:
from the spam.py
==========
‘‘‘

4.也支持导入多行

1 from spam import (read1,
2                   read2,
3                   money)

特殊

from spam import * 把spam中所有的不是以下划线(_)开头的名字都导入到当前位置,大部分情况下我们的python程序不应该使用这种导入方式,因为*你不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。而且可读性极其的差,在交互式环境中导入时没有问题。

from spam import * #将模块spam中所有的名字都导入到当前名称空间
print(money)
print(read1)
print(read2)
print(change)

‘‘‘
执行结果:
from the spam.py
1000
<function read1 at 0x1012e8158>
<function read2 at 0x1012e81e0>
<function change at 0x1012e8268>
‘‘‘

可以使用__all__来控制*(用来发布新版本)

在spam.py中新增一行

__all__=[‘money‘,‘read1‘] #这样在另外一个文件中用from spam import *就这能导入列表中规定的两个名字

模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块

在初始化后,python程序可以修改sys.path,路径放到前面的优先于标准库被加载。

1 >>> import sys
2 >>> sys.path.append(‘/a/b/c/d‘)
3 >>> sys.path.insert(0,‘/x/y/z‘) #排在前的目录,优先被搜索

注意:搜索时按照sys.path中从左到右的顺序查找,位于前的优先被查找,

 

以上是关于模块和包的主要内容,如果未能解决你的问题,请参考以下文章

21.python的模块(Module)和包(Package)

Python语法之模块和包

python基础14 ---函数模块5(模块和包)

Python学习---模块和包

00.模块1.模块(Module)和包(Package)

Python 模块和包的概念