Python 包浅析

1,054 阅读3分钟

玩转Python

这是我参与8月更文挑战的第17天,活动详情查看: 8月更文挑战

1. 包概述

当一个项目中有多个模块时,需要在进行组织。我们将功能类似的模块放到一起,形成了“包”。

本质上,包就是一个必须有一个__init__.py的文件夹

典型结构如下:

image.png

包下面可以包含模块(module),也可以再包含子包(subpackage).类似于像文件夹下面可以有文件,也可以有子文件夹一样。

如seleniumLibrary包文件下,仍然有一个__init__.py文件 image.png

⌛ 总结:包的特征是目录下必须要带__init__.py文件,可以包含多个子包和模块

包结构

2. 创建包

手动创建包(package) 主要由两步:

  1. 创建一个文件夹,该文件夹的名字就是包的包名

  2. 在该文件夹内添加一个__init__.py文件即可

Pycharm中创建包: 主要步骤:

  1. 选择要创建包的路径
  2. 单击右键:New->Python package
  3. Python会自动帮我们生成带有的__init__.py文件的包

Pycharm创建包

例如,我们创建一个Juejin包,文件夹目录结构为

package Juejin
|
|---Juetime
|   |---__init__.py
|   |---module_time.py
|
|---__init__.py
|---module_hello.py

Juejin包子包模块module_time.py 模块内容如下

import time

name = "Juejin.module_time"

def currentdate():

    return  time.strftime("%y/%m/%d",time.localtime())

Juejin包模块module_hello.py内容如下:

name = "Juejin.module_hello"

def hello(name):

    print("hello %s,welcome to juejin",name)

3. 导入包操作

导入包操作有常用形式有:

  1. from package import item

    item 可以是模块,也可以是函数变量

  2. import item1,item2...

    item必须时或者模块,不能是其他

导入包的本质:是导入了包的__init__.py文件

🎯**__init__.py的三个核心作用:**

  1. 作为包的标识,不能删除
  2. 用来实现模糊导入
  3. 导入包实质是执行__init__.py文件,可以在__init__.py文件中做这个包的初始化,以及需要统一执行代码。

📝举个栗子:package Juejin导入模块操作方式

  • 使用import 导入module_time模块

    import Juejin.Juetime.module_time
    

    📌 使用时,必须要添加完整名称来引用

     Juejin.Juetime.module_time.currentdate()
    

    方法一运行结果

  • 使用from 包 import 模块 来导入module_time模块

     from Juejin.Juetime import module_time
    

    📌 使用时,可以直接使用莫可名

    module_time.currentdate()
    

    方法二运行结果

  • 使用from...import直接导入函数

    import Juejin.Juetime.module_time import currentdate
    

    📌使用时,直接使用函数名

    currentdate()
    

    方法三运行结果

4. 用*导入包

Python 也提供了import * 模糊导入文件系统找出包中所有的子模块并导入

🌟 但是会出现,程序找出包的过程会花费比较久的时间?

👉 Python可以解决方法是提供一个明确的包索引:在_init__.py定义位列表的__all__变量

__all__ = ["Module1", "Module2", "subPackage1", "subPackage2"]

✍ 继续以package Juejin导入模块操作方式

  1. 在Juejin包下__init__.py文件添加__all__变量

    __all__ = ["module_hello","Juetime"]
    
  2. 第三方调用

    ```
     from Juejin import *
     module_hello.hello("Bob")
    ```
    

    image.png

🌟 建议在正式项目中,尽量不使用import *方法

5. 包内引用

如果是子包内的引用,可以按相对位置引入子模块

  • 同级目录导入

      from . import 模块名
    
  • 上级目录导入

     from .. import 模块名
    

📢 使用包引用会时常遇到attempted relative import with no known parent package报错

原因是:父级包即上级目录的包的__name__ 等于 __main__和 package = None的时候导致的问题

解决办法:使用import 或者 from import来导入包

总结

本期,我们学习提供 import 与 from...import语法帮助我们更好的导入模块。

比较上一期模块导入,包导入还提供了__init__.py文件定义__all__变量来导入包内所有的模块和子包。

以上是本期内容,欢迎大佬们点赞评论指正,下次见~ღ( ´・ᴗ・` )比心🌹🌹🌹🌹🌹✈️