自定义包结构及__init__.py模块和__all__变量的使用

使用python经常会导入外部包,所以自己写一个深层包结构,然后自己调用,会理解的比较深刻

首先创建如下图所示的包结构:共有3层文件夹,最里面的一层文件夹下面包含4个有关加减乘除的模块,分别提供了+-*/的运算方法。

注意:每一层新建的时候要建Python Package,而不是Directory。

 

一,import

import语句在深层包结构中的用法如下:

import myModule.simpleCompute.compute.addFunc

print(myModule.simpleCompute.compute.addFunc.add1(1,2))

看起来使用比较麻烦,首先从顶层目录一直向下导入到指定模块。调用时仍然需要从顶层一直到模块中的具体方法

 

 

二,from ... import ...

对比import,这种方法导入包后,再调用时就不需要使用包的全名啦。而且可以有不同的导入形式

1,直接从模块导入所需的方法


from myModule.simpleCompute.compute.addFunc import add1

print(add1(1,2))

2,先导入指定模块,再调用具体方法


from myModule.simpleCompute.compute import addFunc

print(addFunc.add1(2,3))

 

三,__init__.py模块

上面的结构中,每一层下面都有一个名为__init__.py的模块,该模块可以为空,用于标识python包

 

四,__all__变量

__all__变量是一个列表,可以在模块中和__init__.py中使用。

__all__变量结合from  ... import * 语句使用,__all__变量就是控制*所表示要引入的东西(模块,函数,类等)

1,如果在模块中使用该变量,下面是addFunc.py的代码:

__all__ = ['add1']     #只导入add1,而不会导入add2
 
def add1(*variaties):
    sum = 0
    for i in variaties:
        sum += i
    return sum
 
def add2(*variaties):
    sum = 0
    for i in variaties:
        sum += i
    return sum
if __name__ == '__main__':
    print(add1(1,2,3,4,5))


那么,在导入该模块下的所有函数时,只会导入列表中声明的函数

from myModule.simpleCompute.compute.addFunc import *

print(add1(1,1))

而此时,调用add2()就会报错

 

2,如果在__init__.py模块中设置__all__变量,则列表内容规定了import * 所导入的模块

我们在compute下的__init__.py模块中添加__all__变量,如下所示:

__all__ = ['addFunc','divFunc','mulFunc']        #列表中填写被引入模块的名称,没有.py

然后在import * 时,只引入被声明的模块

from myModule.simpleCompute.compute import *
print(divFunc.div(2,3))
print(addFunc.add1(1,2))
print(addFunc.add2(1,2))
print(mulFunc.mul(2,3))

而没有被声明的subFunc.py模块则不能使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值