python 自定义包的实现

1. 代码目录

创建自定义包的时候,原理是当 python 检测到一个目录下存在 __init__.py 文件时,python 就会把它当成一个模块(module)。

下面这个例子是网上整理的代码,但是有些小改动,可以直接拿来就用。
看代码结构:

在这里插入图片描述

2. 每个目录的代码

parent 主目录

  1. main.py
import sys

# 这一行需要放在最前面,也是最关键
# 将包含parent包的路径添加进系统路径
sys.path.append(r"..")


print('-----开始import-----\n')

import parent.pack2.mod2_1          # 第1种 引用方法
import parent.pack2.mod2_2 as p2m2  # 第2种 引用方法
from parent.pack.mod import *       # 第3种 引用方法

if __name__ == '__main__':
    print('-----开始main-----\n')

    # 第1种 引用的调用方法
    parent.pack2.mod2_1.func()
    # 第2种 引用的调用方法
    p2m2.func()
    # 第3种 引用的调用方法
    func()
    
    #  import 就会把注册在包 __init__.py 文件中 __all__ 列表中的子模块和子包导入到当前作用域中
    print('\npack2包中的模块有:')
    print(parent.pack2.__all__)
  1. __init__.py
if __name__ == '__main__':
    print('parent 作为主程序运行')
else:
    print('parent 初始化')

2. pack

a. __init__.py

if __name__ == '__main__':
    print('作为主程序运行')
else:
    print('Pack初始化')

b. config.py

run = 9999

c. mod.py

# mod
def func():
    print('pack.mod.func()')

if __name__ == '__main__':
    print('mod 作为主程序运行')
else:
    print('mod 被另一个模块调用')

3. pack2

a. __init__.py


# Pack2 的 __init__.py

# __all__ 用于当前Pack2包是所包含的模块
__all__ = ["mod2_1", "mod2_2", "mod2_3"]

if __name__ == '__main__':
    print('Pack2作为主程序运行')
else:
    print('Pack2初始化')

b. mod2_1.py

# 这里导入上一级目录下的 pack 下面的 config 文件
from parent.pack  import config

# mod2
def func():
    print('pack2.mod2_1.func()')
    print("config: " + str(config.run))

if __name__ == '__main__':
    print('mod2_1 作为主程序运行')
else:
    print('mod2_1 被另一个模块调用')

c. mod_2.py

# mod2
def func():
    print('pack2.mod2_2.func()')

if __name__ == '__main__':
    print('mod2_2 作为主程序运行')
else:
    print('mod2_2 被另一个模块调用')

代码:

  • https://gitee.com/zhiyong47/vine/tree/master/effective_codes/parent

更新(vs code 的代码快捷键定位失败的问题)

如果安装插件后,直接在 parent 目录下打开 vs code,无法通过快捷键 “Ctrl” + 左键快速定位到函数,那么尝试在 parent 的上一级目录打开 vs code 试试。
在这里插入图片描述
上一级目录打开 vs code
在这里插入图片描述

### 创建和使用Python自定义Python中,创建和使用自定义是一种组织代码的有效方式。以下是关于如何实现这一目标的具体方法。 #### 自定义的基础结构 为了创建一个自定义,首先需要构建合适的目录结构。通常情况下,是一个含`__init__.py`文件的目录[^1]。这个文件可以为空,但它标志着该目录应被视为一个。例如: ```plaintext my_package/ __init__.py module1.py module2.py ``` 在这个例子中,`my_package` 是名,而 `module1.py` 和 `module2.py` 则是属于此的模块[^1]。 #### 导入中的模块 一旦已经建立好,就可以通过多种方式进行导入操作。如果要从中导入特定模块,可采用如下语法: ```python from my_package.module1 import some_function some_function() ``` 或者也可以直接导入整个模块并调用其中的内容: ```python import my_package.module1 as mod1 mod1.some_function() ``` 上述两种方式均能正常工作,并且可以根据实际需求选择适合的形式[^1]。 #### 初始化文件的作用 对于内的`__init__.py` 文件来说,它不仅可以用来标记这是一个,还可以执行初始化代码或决定哪些属性应该暴露给外部使用者。比如,在`__init__.py` 中设置公开接口: ```python # my_package/__init__.py from .module1 import some_function from .module2 import SomeClass __all__ = ['some_function', 'SomeClass'] ``` 这样做的好处在于简化了用户的导入过程,他们可以直接从级别进行导入而不是深入到各个子模块之中。 #### 路径配置注意事项 当尝试运行位于不同位置下的脚本时可能会遇到找不到模块的问题。这是因为默认情况下只有当前工作目录以及标准库所在的位置会被加入到系统的模块搜索路径里。可以通过修改环境变量PYTHONPATH或将项目根目录添加至sys.path来解决这个问题: ```python import sys sys.path.append('/path/to/my_project') ``` 这一步骤确保即使是在其他地方启动程序也能正确找到所需的自定义及其依赖项。 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值