当前位置:   article > 正文

Python之模块详细梳理(五)

python之模块详细梳理(五),把模块做成包,避免间接引用

包的定义

python包是一种特殊的文件夹,用来存放多个相互关联的模块文件和资源文件,该文件夹下必须有__init__.py文件。Python首次导入包时会自动运行__init__.py文件。若没有这个文件会被视为文件夹,有这个文件才会被视为包。

包的示例

文件夹jihe下有3个文件,内容如下:

__init__.py文件:

  1. from jihe import mianji # 导入mianji.py模块
  2. from jihe import tiji # 导入tiji.py模块
  3. __all__ = ['mianji', 'tiji'] # 定义from jihe import *可使用的模块名

mianji.py文件:

  1. '''
  2. 计算面积
  3. '''
  4. def changfx(a, b):
  5. return a*b
  6. def yuanx(r):
  7. return 3.14159*r*r
  8. def sanjx(a, b):
  9. return a*b/2

tiji.py

  1. '''
  2. 计算体积
  3. '''
  4. def changft(a, b, c):
  5. return a*b*c
  6. def zhengft(a):
  7. return a**3

引用包的不同方式

test1.py文件(使用from jihe import *方式,可使用的函数会受__all__限制):

  1. from jihe import *
  2. print(mianji.changfx(3,5))
  3. print(mianji.sanjx(2,4))
  4. print(mianji.yuanx(5))
  5. print(tiji.changft(2,3,4))
  6. print(tiji.zhengft(3))
  7. out:
  8. 15
  9. 4.0
  10. 78.53975
  11. 24
  12. 27

test2.py文件(使用import jihe方式,可使用的函数不受__all__限制):

  1. import jihe
  2. print(jihe.mianji.changfx(3,5))
  3. print(jihe.mianji.sanjx(2,4))
  4. print(jihe.mianji.yuanx(5))
  5. print(jihe.tiji.changft(2,3,4))
  6. print(jihe.tiji.zhengft(3))
  7. out:
  8. 15
  9. 4.0
  10. 78.53975
  11. 24
  12. 27

from XX import *的方式使用包内资源时省略包名写“模块名.成员名”即可,但有命名冲突的风险。

import XX的方式使用包内资源时要写“包名.模块名.成员名”才行,但不会有命名冲突的风险。

定义包的另类方法

以下写一个定义包的另类方法,拓展思路,给大家参考。

还是沿用前面的案例,但__init__.py文件重新定义如下:

  1. from .mianji import *
  2. from .tiji import *
  3. __all__ = ['changfx', 'yuanx','sanjx','changft','zhengft']

test3.py文件(使用from jihe import *方式,可使用的函数会受__all__限制):

  1. from jihe import *
  2. print(changfx(3,5))
  3. print(sanjx(2,4))
  4. print(yuanx(5))
  5. print(changft(2,3,4))
  6. print(zhengft(3))
  7. out:
  8. 15
  9. 4.0
  10. 78.53975
  11. 24
  12. 27

__init__.py文件使用from XX import *方式,test3也使用from XX import *,可以将jihe包内所有成员当成本地成员使用。优点是使用包内资源时只需要写成员名即可,缺点是命名冲突的概率大增。

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号