python 模块、包、命名空间、搜索路径

本文详细介绍了Python中的模块、命名空间、导入机制及其变体,包括如何使用import、from...import以及import...as进行模块导入。还探讨了__name__属性在判断模块是否为主程序时的作用,以及sys.path搜索路径和包的创建与使用。此外,文章提到了Python的设计哲学,并强调了良好的模块组织和接口定义对于代码可读性和可维护性的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.模块是什么

• 容器(列表、元组、字符串、字典等),是对数据的封装。

• 函数,是对语句的封装。

• 类,是对方法和属性的封装,也就是对函数和数据的封装。

•模块,是对功能代码(程序)的封装

2.命名空间

命名空间(namespace)表示标识符 (identifier)的可见范围。一个标识符可在多个命名空间中定义,它在 不同命名空间中的含义是互不相干的。在Python中,每个模块都会维护一个独立的命名空间,应该将模块 名加上,才能够正常使用模块中的函数

3.导入模块

第一种:import模块名

直接使用import,但是在调用模块中的函数的时候,需要加上模块的命名空间

# p13_2.py
import p13_1

print("32摄氏度 = %.2f华氏度" %  p13_1.c2f(32))
print("99华氏度 = %.2f摄氏度" %  p13_1.f2c(99))

第二种:from 模块名 import 函数名

这种导入方法会直接将模块的命名空间覆盖进来,所以调用的时候 也就不需要再加上命名空间了

还可以使用通配符星号(*)来导入模块中所有的命名空间。可能会陷入名字混乱的局面

from p13_1 import c2f, f2c

print("32摄氏度 = %.2f华氏度" % c2f(32))
print("99华氏度 = %.2f摄氏度" % f2c(99))

from p13_1 import * #不推荐

第三种:import模块名as新名字

最好的总是留在最后,第三种方法结合了前两种的优势,使用这种方法可以给导入的命名空间起一个新的名字。

# p13_4.py
import p13_1 as tc

print("32摄氏度 = %.2f华氏度" % tc.c2f(32))
print("99华氏度 = %.2f摄氏度" % tc.f2c(99))

4. _ _name_ _='_ _main_ _'

让Python知道该模块是作为程序运行还 是导入到其他模块中。在作为程序运行的时候,_ _name_ _属性的值是'_ _main_ _';而作 为模块导入的时候,这个值就是该模块的名字。

# p13_7.py
def c2f(cel):
    fah = cel * 1.8 + 32
    return fah
    
def f2c(fah):
    cel = (fah - 32) / 1.8
    return cel

def test():
    print("测试,0摄氏度 = %.2f华氏度" % c2f(0))
    print("测试,0华氏度 = %.2f摄氏度" % f2c(0))

if __name__ == '__main__':
    test()

#上面的代码确保只有单独运行p13_7.py时才会执行test()函数。

5.搜索路径

就是一组目录,可以通过sys模块中的path变量显示出来。

sys.path.append("E:\\M1")#加入搜索路径
sys.path

6.包

创建一个包的具体操作如下:

(1)创建一个文件夹用于存放相关的模块,文件夹的名字即包的名字。

(2)在文件夹中创建一个_ _init_ _.py的模块文件,内容可以为空。

(3)将相关的模块放入文件夹中。

注意: 在第(2)步中,必须在每一个包目录下建立一个_ _init_ _.py模 块,可以是一个空文件,也可以写一些初始化代码。这是Python的规定,用来告诉Python将该目录当成一个包来处理。不加这个文件其实也可以正常导入。

接下来就是在程序中导入包的模块(包名.模块名

# p13_8.py
# 请先按步骤将p13_7.py放在了文件夹M1中
import M1.p13_7 as tc

print("32摄氏度 = %.2f华氏度" % tc.c2f(32))
print("99华氏度 = %.2f摄氏度" % tc.f2c(99))

7.Python的设计哲学是“优雅、明确、简单”

PEP(Python Enhancement Proposal,Python增强建议书)

可以调用_ _doc_ _属性,查看这个模块的简介

dir()函数可以查询到该模块定义了哪些变量、函数和类

_ _all_ _属性就可以直接获得可供调用接口的信息

这里有两点需要注意:

第一,不是所有的模块都有_ _all_ _属性;

第二,如果一个模块设置了_ _all_ _属性,那么使用“from timeit import *”这样的形式导入命名空间,就只有_ _all_ _属性这个列表里的名字才会被导入,其他名字不受影响

但如果没有设置_ _all_ _属性的话,用“from模块名import *”就会把 所有不以下画线开头的名字都导入到当前的命名空间。所以,建议在编 写模块的时候,将对外提供的接口函数和类都设置到_ _all_ _属性的列表里。

另外还有一个名为_ _file_ _的属性,这个属性指明了该模块的源代码位置。

最后,还有一道“杀手锏”,也是常用的,即help()函数:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值