模块

模块

在Python中,模块是最高级别的程序组织单元,它将程序代码和数据封装起来以重用。从实际的角度来看,模块往往对应与Python程序文件(或是用外部语言如C、Java或C#编写而成的扩展)。每一个文件都是一个模块,并且模块导入其他模块之后就可以使用导入模块定义的变量名。模块可以由两个语句和一个重要的内置函数进行处理。

import
    使客户端(导入者)以一个整体获取一个模块
from
    允许客户端从一个模块文件中获取特定的变量名
reload
    在不终止Python程序的情况下,提供了一种重新载入模块文件代码的方法

import工作方式

在Python中,模块的导入操作和C语言中的#include不相同,导入其实是运行时的运算,程序第一次导入指定文件时,会执行三个步骤:

  1. 找到模块文件
  2. 编译成位码(需要时)
  3. 执行模块的代码来创建其所定义的对象。

在这里,模块在寻找文件位置时要进行路径搜索。其中程序员可以进行调整来告诉Python去哪里搜索。

  1. 程序的主目录
  2. Python目录(如果已经进行了设置)
  3. 标准链接库目录
  4. 任何.pth文件的内容(如果存在的话)

from 语句

from会把变量名复制到另一个作用域,所以它就可以让我们直接在脚本中使用复制后的变量名,而不需要通过模块

而对于from *语句,则会取得模块顶层所有赋了值的变量名的拷贝。对于导入,每个导入都是只会发生一次。如果再次导入,则应该使用reload方法进行重新导入。

对于from * 语句,会把模块内所有的变量名复制出来,故,需要采取一定的办法进行阻止这种行为。如在变量名前加_或将变量名的字符串列表赋值给变量all

__name__ 单元测试

在Python中,每个文件就是一个可执行的脚本,故当一个文件里有可执行文件时,执行import操作就会执行导入的文件里的可执行操作。如:

#定义test.py文件
def minmax(test,*args):
    res = args[0]
    for tar in args[1:]:
        if test(res,tar):
            res = tar
    return res
def lessthan(x,y):
    return x<y
def grtrthan(x,y):
    return x>y

print minmax(lessthan,4,2,1,5,6,3)
print minmax(grtrthan,4,2,1,5,6,3)
#Hello.py中进行导入操作
import test
print 124

可以得到运行的结果为6,1,124可以看到,当执行导入操作时,是会运行文件的。
在此,只需要进行__name__检测则可避免此操作。如:

def minmax(test,*args):
    res = args[0]
    for tar in args[1:]:
        if test(res,tar):
            res = tar
    return res
def lessthan(x,y):
    return x<y
def grtrthan(x,y):
    return x>y
if __name__ == '__main__':
    print minmax(lessthan,4,2,1,5,6,3)
    print minmax(grtrthan,4,2,1,5,6,3)

#导入到Hello.py中
import test
print 124

得到的只有124

import as 扩展

在import语句中,需要重命名或者使用别名的话,那么可以使用import as 进行导入库,如

import longmodulename as name
#等价于
import longmodulename
name = longmodulename
del longmodulename      # 不保留模块名

相对导入

对于比较长的模块名或包名,可以采用相对导入。如

from .spam import name

意思是在spam这个模块里,导入name这个变量。

模块的设计理念

就像函数一样,模块也是有设计方面的折衷考虑:需要思考哪些函数放进模块、模块通信机制等。当开始编写较大的Python系统时,这些就会变得明朗起来,但设计的通用概念如下:

  • 总是在Python的模块内编写代码
  • 模块耦合要降到最低:全局变量就像函数一样,如果编写成闭合的盒子,模块运行得最好,原则就是,模块应该尽可能和其他模块的全局变量无关。
  • 最大化模块的粘合度:统一目标
  • 模块应该少去修改其他模块的变量
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值