python的模块,包和目录的区别和自定义包的注意点

简介: 先插入模块/包是怎么找的先找当前的包找有没有,没有去安装目录的内置函数中,再没有看看你设置的系统环境变量有没有一般情况,代码添加的环境变量只存在当前窗口,关闭就没了-

先插入模块/包是怎么找的

先找当前的包找有没有,没有去安装目录的内置函数中,再没有看看你设置的系统环境变量有没有

一般情况,代码添加的环境变量只存在当前窗口,关闭就没了-

正题

  1. python中模块是包含变量、函数等的文件;只要是你想引用的文件都叫模块
  2. 包是存放多个文件/模块的文件夹,可以 统一组织和管理 多个python模块
  3. 包结构中包含一个特殊的文件[__init__.py]。

两者的区别:包是一个文件夹,可以存放多个文件/模块,

模块是一个文件。

模块可以放在包,也可以放在目录,而放在包的作用是(见上见下)


在引入Package中的模块时from xx import xx和import xx,而使用后者时还要确保__init__.py文件中个导入了模块

在引入Directory中内容时,只可以引入该目录的子目录中的内容,也可以在目录中添加__init__.py使之可以像包一样引用


而使用import xx(特别注意,这里的xx是包名!)时还要确保__init__.py文件中个导入了模块

这个再详细说明

做为包,你可以选择import和from 前者引用全部,后者可以选择包中的子模块,而当引用全部却没有在__init__.py写子模块的位置就会报错,例如:

import pay #引用pay这个包
pay.alipay.tools.pay2()# 再使用pay包当前目录的alipay文件夹里的tools.py里的pay2方法

会报错

module 'pay' has no attribute 'alipay'

报错是因为导入包,实际是导入包的__init__.py

那为什么 from pay.alipay.tools import pay2 可以??

A:因为这种方式已经明确了路径了啊,或者见下面对于单文件和目录的说法吧~

直接import pay 对的就是pay下的__init__.py 这个很关键,而当你使用包里的子模块或者方法的时候必须在__init__.py写明位置,不然读取不了

如何修复?

一般下__init__.py都是空的,要去写

pay下的__init__.py 加 from . import alipay

同样在alipay文件下的__init__.py 填from .tools import pay2, get_status //注意这里import 可以逗号形式写

. 是什么呢?可以说.就是当前目录,也就是前面我非要在前面别扭地打出当前目录

说到这里,可能又发现-

那为什么 from pay.alipay.tools import pay 这个pay前面没有. 因为这种直接明确地址的是在项目的根目录开始找起,不需要添加,添加反而出错

这里要区分开,就是在 __init__.py引用要加当前目录

from . import alipay 意思是 pay下作为当前目录,找pay里的alipay

好,说到这里你可以有点糊涂了,没事,先冷静下

引用单个文件的时候,写的import就得麻烦了

1.from的写法

假设a文件夹里的b文件夹有c.py 我们引用的时候得这样写

from a.b import c 这意思是占用的父文件夹a当前目录(.)下的b,b文件夹的c.py

2.import c,至于怎么找,看最上面的插入吧

这里要跟包区分,因为包的import是文件夹的/包的名称,而这里就是c.py,因此直接指向c.py,而包名指向__init__.py

包可以选择两种方法,from更能选择包里的子包。

这里继续说到上面的遗留问题

from pay.alipay.tools import pay2

对于上面来说,没有加.是因为从根目录上找,pay却是a文件夹的,那为什么这里又把a.b写上,而不写b呢,

1.这是单个文件,或者说是目录的文件,不是包

2.在引入Directory中内容时,只可以引入该目录的子目录中的内容,在上面谈到了。因为如果直接写b,它会认为是一个包,但是却没有__init__.py,所以说这里得b弄成子目录,否则不能引用b文件夹的c.py,也就说引用模块,from必须的是子目录

,写出子目录,即使是包,也得指向from pay.tools pay的tools.py 没有直接指向pay。或者说只写一个,先认为你是一个模块,而不是目录。也就是最后一个tool和第一个必须是模块,而不是目录……

只写一个目录,还不如直接当包直接import

其实,还有个最最不会出错的方法就是……

写好包,先不引用,写好部分代码,让pycharm给你自动修复引用@(真棒)


目录
相关文章
|
2天前
|
数据采集 Web App开发 JavaScript
python-selenium模块详解!!!
Selenium 是一个强大的自动化测试工具,支持 Python 调用浏览器进行网页抓取。本文介绍了 Selenium 的安装、基本使用、元素定位、高级操作等内容。主要内容包括:发送请求、加载网页、元素定位、处理 Cookie、无头浏览器设置、页面等待、窗口和 iframe 切换等。通过示例代码帮助读者快速掌握 Selenium 的核心功能。
18 5
|
1天前
|
Python
SciPy 教程 之 SciPy 模块列表 16
SciPy教程之SciPy模块列表16 - 单位类型。常量模块包含多种单位,如公制、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例代码展示了力学单位的使用,如牛顿、磅力和千克力等。
4 0
|
2天前
|
JavaScript Python
SciPy 教程 之 SciPy 模块列表 15
SciPy 教程之 SciPy 模块列表 15 - 功率单位。常量模块包含多种单位,如公制、质量、时间等。功率单位中,1 瓦特定义为 1 焦耳/秒,表示每秒转换或耗散的能量速率。示例代码展示了如何使用 `constants` 模块获取马力值(745.6998715822701)。
6 0
|
2天前
|
JavaScript Python
SciPy 教程 之 SciPy 模块列表 15
SciPy教程之SciPy模块列表15:单位类型。常量模块包含多种单位,如公制、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。功率单位以瓦特(W)表示,1W=1J/s。示例代码展示了如何使用`constants`模块获取马力(hp)的值,结果为745.6998715822701。
7 0
|
7天前
|
安全 数据处理 开发者
Python中的多线程编程:从入门到精通
本文将深入探讨Python中的多线程编程,包括其基本原理、应用场景、实现方法以及常见问题和解决方案。通过本文的学习,读者将对Python多线程编程有一个全面的认识,能够在实际项目中灵活运用。
|
1天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
6天前
|
弹性计算 安全 小程序
编程之美:Python让你领略浪漫星空下的流星雨奇观
这段代码使用 Python 的 `turtle` 库实现了一个流星雨动画。程序通过创建 `Meteor` 类来生成具有随机属性的流星,包括大小、颜色、位置和速度。在无限循环中,流星不断移动并重新绘制,营造出流星雨的效果。环境需求为 Python 3.11.4 和 PyCharm 2023.2.5。
26 9
|
2天前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从基础到实战
【10月更文挑战第24天】本文将带你进入Python的世界,从最基础的语法开始,逐步深入到实际的项目应用。我们将一起探索Python的强大功能和灵活性,无论你是编程新手还是有经验的开发者,都能在这篇文章中找到有价值的内容。让我们一起开启Python的奇妙之旅吧!
|
3天前
|
设计模式 监控 数据库连接
Python编程中的设计模式之美:提升代码质量与可维护性####
【10月更文挑战第21天】 一段简短而富有启发性的开头,引出文章的核心价值所在。 在编程的世界里,设计模式如同建筑师手中的蓝图,为软件的设计和实现提供了一套经过验证的解决方案。本文将深入浅出地探讨Python编程中几种常见的设计模式,通过实例展示它们如何帮助我们构建更加灵活、可扩展且易于维护的代码。 ####