Python自学 - “包”的创建与使用(从头晕到了然)
<< 返回目录
1 Python自学 - “包”的创建与使用(从头晕到了然)
相对于模块
,包
是一个更大的概念,按照业界的开发规范,1个代码文件不要超过1000行,稍微有点规模的任务就超过这个代码限制了,必然需要多个文件来管理,对于这种包含多个代码文件的模块集,我们一般通过单独新建文件夹来管理,而这个文件夹及里面的文件,我们就称之为包。
包里面还可以放文件夹,子文件夹里面还可以放代码文件。
- 约束
- 包的文件夹里面必须要有
__init__.py
文件,子文件夹也需要有,该文件可以是空文件,也可以包含python
代码(初始化包级别的变量、导入模块或子包等),当执行import
语句时,包中的__init__.py
会执行。
- 包的文件夹里面必须要有
1.1 创建包
假设我们要构造一个人类社会的包,包名叫social
,在social
中还会包含多个子包:人(human
)、学生(student
)、工人(worker
)…
目录结构如下:
social
├── __init__.py
├── human
│ ├── __init__.py
│ └── human.py
├── student
│ ├── __init__.py
│ └── student.py
└── worker├── __init__.py└── worker.py
1.2 使用包
本节主要讨论__init__.py
文件内容对包使用方式的影响,主要涉及包的导入路径。
1.2.1 __init__.py
全空时的使用方式
包中所有目录包括子目录下的__init__.py
文件全部为空
- 示例1:
__init__.py
全空时包的使用方式
import social.human.human
h1 = social.human.human.Human('小飞棍', 22, '男')
print(h1)
输出:
Human, name:小飞棍, age:22, gender:男.
点评:这种方式,在使用对象Human
时,需要输入一长串路径,非常麻烦,并不是一种好的方式
问题:为什么使用Human
对象的命名空间如此之深?
我们对social.human.human.Human
拆分从前到后理解如下:
social
: 表示包的根目录(或者说包名,本质还是目录名)human
:对应social
目录下的子目录human
。human
:对应子目录human
下的human.py
文件。Human
:对应human.py
文件中的class Human
。
请读者回头阅读前文中的目录结构!
- 示例2:
__init__.py
全空时包的使用方式-改进
import social.human.human as H
h1 = H.Human('小飞棍', 22, '男')
print(h1)
输出:
Human, name:小飞棍, age:22, gender:男.
点评:在导入时使用了别名, 将一长串的模块名,指定别名H
,在使用对象时,只需要使用别名H
来指定命名空间。
- 示例3:
__init__.py
全空时包的使用方式-改进2
本示例中,使用from
关键字导入对象,大家关注路径:social.human.human
直接指定到了human.py
文件,所以此时import *
已经可以够得着Human
对象了,因此,在代码中可以直接使用Human
声明对象。
from social.human.human import *
h1 = Human('小飞棍', 22, '男')
print(h1)
输出:
Human, name:小飞棍, age:22, gender:男.
1.2.2 包的根目录下的__init__.py
加上导入子包语句
包social
根目录下的__init__.py
使用import
导入子包,而子包下的__init__.py
仍然为空。
social
根目录下的__init__.py
文件内容:
from . import human
from . import student
from . import worker
这里的"."是相对路径, 因为social
目录下就是子包的目录名human
- 示例4:包的根目录
__init__.py
内容完整时的包使用示例
import social
h1 = social.human.human.Human('小飞棍', 22, '男')
print(h1)
输出:
Human, name:小飞棍, age:22, gender:男.
点评:差评!必须差评!__init__.py
为空时使用Human
对象就这么一长串:social.human.human.Human
,__init__.py
写了import
语句,还要这么长一串,那__init__.py
不是白写了!
亲,我知道你很急,但是请你先不要急!我们来掰扯一下!
social
目录下执行了from . import human
,这里的from .
中的“.”表示当前目录,本质还是social
,然后导入了human
只是social下的子目录human
,所以,在social
的命名空间,social.human
只能够到social
目录下的子目录human
。
要够到human.py
文件,还要再加一层.human
,最后才能够到Human
类。
但是你得到了一个好处,import social
这句不是短了?!
- 示例5:根目录的
__init__.py
导入时多走一层
social
根目录下的__init__.py
文件内容:
from .human import human #只改human子包引用方式,以示区别
from . import student
from . import worker
包的导入及使用代码(如果代码不变):
import social
h1 = social.human.human.Human('小飞棍', 22, '男')
print(h1)
输出:
Traceback (most recent call last):File "D:\TYYSOFT\Study\Python\test_package.py", line 2, in <module>h1 = social.human.human.Human('小飞棍', 22, '男')
AttributeError: module 'social.human.human' has no attribute 'human'
点评:__init__.py
已经多走了一步,但是执行代码中没有退一步,踩到脚了,出错了!
正确的导入及使用代码:
import social #这里已经够到了human.py
h1 = social.human.Human('小飞棍', 22, '男')
print(h1)
输出:
Human, name:小飞棍, age:22, gender:男.
点评:因为在__init__.py
中执行了from .human import human
,from .human
语句中,“.”表示当前目录(social
),然后接着是子目录(human
),from
这半句已经进入到了social/human
子目录,后半句import human
相当于把human.py
已经拿到了social
命名空间下,因此:social.human
已经够到了human.py
文件!
顺理成章的social.human.Human
就够到了Human
类。
1.2.3 根目录下的__init__.py
和子目录下的__init__.py
关系
读者可能会有疑惑,根目录下有__init__.py
文件,子目录下也有__init__.py
文件,那这些__init__.py
文件有什么关系呢?
一切与import
语句强相关:
import social
: 执行包目录social
下的__init__.py
文件
import social.human
: 执行目录social/human
下的__init__.py
文件
1.2.4 子包引用子包
子包student
中的Student
类需要继承Human
类,因此,需要导入human.py
模块
student.py
代码示例:
from social.human.human import *
class Student(Human):def __init__(self, name, age, gender, grade):self.grade = gradesuper().__init__(name, age, gender)def __str__(self):return f"Student: (name: {self.name}, age: {self.age}, gender: {self.gender}, grade: {self.grade})"
注:这里使用了绝对路径,也可以使用相对路径:from ..human.human import *
主程序代码:
import social.student.student as ST
std = ST.Student("小飞棍", 18, '男', '9')
print(std)
输出:
Student: (name: 小飞棍, age: 18, gender: 男, grade: 9)
1.2.5 对from social import *
的定制
from xxx import *
一般会把xxx
包下的所有对象都导入到当前命名空间,那如果想隐藏某些细节,或仅仅是为了防止对象冲突该怎么办呢?
此时会用到__init__.py
文件中的变量__all__
__init__.py
示例:
from . import human
from . import student
from . import worker__all__ = ['human', 'student']
读者请注意:__all__
变量只填写了两个模块:human
和student
,而没有worker
执行代码:
from social import *
print(dir(human))
print(dir(student))
print(dir(worker))
输出:
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'human']
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']
Traceback (most recent call last):File "D:\TYYSOFT\Study\Python\test_package.py", line 4, in <module>print(dir(worker))
NameError: name 'worker' is not defined
点评:代码报错, 提示worker
找不到!
1.3 总结
import
到哪个目录,就执行哪个目录的__init__.py
文件。__init__.py
中的导入语句要和业务代码中的import
语句保持一致,不要踩到脚!
本文中的`__init__.py`文件中的`import`都使用了相对路径,`Python`也支持绝对路径,如:`from social.human.human import *`
作者声明:本文用于记录和分享作者的学习心得,可能有部分文字或示例来源自豆包AI,由于本人水平有限,难免存在表达错误,欢迎留言交流和指教!
Copyright © 2022~2025 All rights reserved.
<< 返回目录
相关文章:
Python自学 - “包”的创建与使用(从头晕到了然)
<< 返回目录 1 Python自学 - “包”的创建与使用(从头晕到了然) 相对于模块,包是一个更大的概念,按照业界的开发规范,1个代码文件不要超过1000行,稍微有点规模的任务就超过这个代码限制了,必然需要多个文件来管…...
ElasticSearch 同义词匹配
synonym.txt 电脑, 计算机, 主机 复印纸, 打印纸, A4纸, 纸, A3 平板电脑, Pad DELETE /es_sku_index_20_20250109 PUT /es_sku_index_20_20250109 {"settings": {"index": {"number_of_shards": "5","number_of_replicas&quo…...
android 官网刷机和线刷
nexus、pixel可使用google官网线上刷机的方法。网址:https://flash.android.com/ 本文使用google线上刷机,将Android14 刷为Android12 以下是失败的线刷经历。 准备工作 下载升级包。https://developers.google.com/android/images?hlzh-cn 注意&…...
Vue环境变量配置指南:如何在开发、生产和测试中设置环境变量
-## 前言 Vue.js是一个流行的JavaScript框架,它提供了许多工具和功能来帮助开发人员构建高效、可维护的Web应用程序。其中一个重要的工具是环境变量,它可以让你在不同的环境中配置不同的参数和选项。在这篇博客中,我们将介绍如何在Vue应用程…...
蓝桥杯_B组_省赛_2022(用作博主自己学习)
题目链接算法11.九进制转十进制 - 蓝桥云课 进制转换 21.顺子日期 - 蓝桥云课 时间与日期 31.刷题统计 - 蓝桥云课 时间与日期 41.修剪灌木 - 蓝桥云课 思维 51.X 进制减法 - 蓝桥云课 贪心 61.统计子矩阵 - 蓝桥云课 二维前缀和 71.积木画 - 蓝桥云课 动态规划 82.扫雷 - 蓝桥…...
【干货】交换网络环路介绍
定义 以太网交换网络中为了提高网络可靠性,通常会采用冗余设备和冗余链路,然而现网中由于组网调整、配置修改、升级割接等原因,经常会造成数据或协议报文环形转发,不可避免的形成环路。如图7-1所示,三台设备两两相连就…...
unity——Preject3——面板基类
目录 1.Canvas Group Canvas Group 的功能 Canvas Group 的常见用途 如何使用 Canvas Group 2.代码 3.代码分析 类分析:BasePanel 功能 作用 实际应用 代码解析:hideCallBack?.Invoke(); 语法知识点 作用 虚函数(virtual)和抽象类(abstract)的作用与区别 …...
BTC系列 - 启示录
推荐《区块链启示录:中本聪文集》这本书, 原来早在2010年, BTC生态还不完善的时候, 社区中就已经畅想出了未来其它链上的特色方案, 中本聪也都一一做了教父级回应: coinbase币的成熟时间, 交易池, 交易确认机制, 防51%攻击, 防双重消费, 水龙头, 轻量级客户端, 链上…...
C# 25Dpoint
C# 25Dpoint ,做一个备份 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace _25Dpoint {public partial cl…...
Kotlin构造函数
class Person {var name: String? nullvar age: Int? nullfun think() {println("Mr./Ms.$name, who is $age years old, is thinking!")} }fun main () {val p Person()p.name "Jimmy"p.age 20p.think() } 在Kotlin中任意一个非抽象类都无法被继承…...
springMVC---resultful风格
目录 一、创建项目 pom.xml 二、配置文件 1.web.xml 2.spring-mvc.xml 三、图解 四、controller 一、创建项目 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi…...
flutter 装饰类【BoxDecoration】
装饰类 BoxDecoration BoxDecoration 是 Flutter 中用于控制 Container 等组件外观的装饰类,它提供了丰富的属性来设置背景、边框、圆角、阴影等样式。 BoxDecoration 的主要属性 1.color 背景颜色。类型:Color?示例: color: Colors.blu…...
自动连接校园网wifi脚本实践(自动网页认证)
目录 起因执行步骤分析校园网登录逻辑如何判断当前是否处于未登录状态? 书写代码打包设置开机自动启动 起因 我们一般通过远程控制的方式访问实验室电脑,但是最近实验室老是断电,但重启后也不会自动连接校园网账户认证,远程工具&…...
微信小程序集成Vant Weapp移动端开发的框架
什么是Vant Weapp Vant 是一个轻量、可靠的移动端组件库,于 2017 年开源。 目前 Vant 官方提供了 Vue 2 版本、Vue 3 版本和微信小程序版本,并由社区团队维护 React 版本和支付宝小程序版本。 官网地睛:介绍 - Vant Weapp (vant-ui.gith…...
MySQL从库 Last_SQL_Errno: 1197 问题处理过程
记录一个遇到过的错误,今天整理一下。 问题 MySQL error code MY-001197 (ER_TRANS_CACHE_FULL): Multi-statement transaction required morethan max_binlog_cache_size bytes of storage; increase this mysqld variable and try again报错很明显是max_binlog_…...
springboot 加载本地jar到maven
在Spring Boot项目中,如果你想要加载一个本地的jar文件到Maven本地仓库,你可以使用Maven的install-file目标来实现。以下是一个简单的例子: 打开命令行工具(例如:终端或者命令提示符)。 执行以下Maven命令…...
面向B站商业化场景的广告标题智能推荐
01.背景 大模型的发展也在不断改变广告主/代理商广告创编的过程,为了提高广告主的创作效率,提升广告主投放标题的质量,我们利用大语言模型技术以及B站商业数据,能够让广告主仅需要输入特定的关键词,即可以生成理论上无…...
element plus 使用 upload 组件达到上传数量限制时隐藏上传按钮
最近在重构项目,使用了 element plus UI框架,有个功能是实现图片上传,且限制只能上传一张图片,结果,发现,可以限制只上传一张图片,但是上传按钮还在,如图: 解决办法&…...
java进行pdf文件压缩
文章目录 pdf文件压缩 pdf文件压缩 添加依赖 <dependency><groupId>com.luhuiguo</groupId><artifactId>aspose-pdf</artifactId><version>23.1</version> </dependency>public class OptimizePdf {public static void opti…...
初识算法和数据结构P1:保姆级图文详解
文章目录 前言1、算法例子1.1、查字典(二分查找算法)1.2、整理扑克(插入排序算法)1.3、货币找零(贪心算法) 2、算法与数据结构2.1、算法定义2.2、数据结构定义2.3、数据结构与算法的关系2.4、独立于编程语言…...
内网服务器添加共享文件夹功能并设置端口映射
参考网址 https://blog.csdn.net/Think88666/article/details/118438465 1.服务器安装smb服务,由于网路安全不允许使用默认端口(445,446),于是修改端口为62445、62446。 2.每台需要共享的电脑都要修改端口映射&#x…...
ruoyi-cloud docker启动微服务无法连接nacos,Client not connected, current status:STARTING
ruoyi-cloud docker启动微服务无法连接nacos,Client not connected, current status:STARTING 场景 当使用sh deploy.sh base来安装mysql、redis、nacos环境后,紧接着使用sh deploy.sh modules安装微服务模块,会发现微服务无法连接nacos的情…...
Python----Python高级(函数基础,形参和实参,参数传递,全局变量和局部变量,匿名函数,递归函数,eval()函数,LEGB规则)
一、函数基础 1.1、函数的用法和底层分析 函数是可重用的程序代码块。 函数的作用,不仅可以实现代码的复用,更能实现代码的一致性。一致性指的是,只要修改函数的代码,则所有调用该函数的地方都能得到体现。 在编写函数时…...
excel 整理表格,分割一列变成多列数据
数据准备 对于很多系统页面的数据是没有办法下载的。 这里用表格数据来举例。随便做数据的准备。想要看excel部分的可以把这里跳过,从数据准备完成开始看。 需要一点前端基础知识,但不多(不会也行)。 把鼠标放在你想要拿到本地的…...
Oracle 分区索引简介
目录 一. 什么是分区索引二. 分区索引的种类2.1 局部分区索引(Local Partitioned Index)2.2 全局分区索引(Global Partitioned Index) 三. 分区索引的创建四. 分区索引查看4.1 USER_IND_COLUMNS 表4.2 USER_INDEXES 表 五. 分区索…...
C++实现设计模式--- 观察者模式 (Observer)
观察者模式 (Observer) 观察者模式 是一种行为型设计模式,它定义了一种一对多的依赖关系,使得当一个对象的状态发生改变时,其依赖者(观察者)会收到通知并自动更新。 意图 定义对象之间的一对多依赖关系。当一个对象状…...
CentOS 6.8 安装 Nginx
个人博客地址:CentOS 6.8 安装 Nginx | 一张假钞的真实世界 提前安装: # sudo yum install yum-utils 一般情况下这个工具系统已经安装。 创建文件/etc/yum.repos.d/nginx.repo,输入内容如下: [nginx-stable] namenginx stab…...
px、em 和 rem 的区别:深入理解 CSS 中的单位
文章目录 前言一、px - 像素 (Pixel)二、em - 相对父元素字体大小 (Ems)三、rem - 相对于根元素字体大小 (Root Ems)四、综合比较结语 前言 在CSS中,px、em和rem是三种用于定义尺寸(如宽度、高度、边距、填充等)的长度单位。它们各自有不同的…...
vue 表格内点编辑,单元格不切换成输入框问题分析
vue 表格渲染时,我点击编辑时,想直接在单元格上面进行编辑。 效果如下,正常是文本效果,点击编辑时,出现输入框 其实实现起来,逻辑很简单,但是中间我却出现了一个问题,效果始终出不…...
MATLAB学习笔记-table
1.在table中叠加table table 的每一列具有固定的数据类型。如果要让表的所有单元格都可以任意填充,就得让每一列都是 cell 类型,这样表中每个单元格都是“一个元胞”。创建时可以先构造一个 空 cell 数组(大小为行数列数)&#x…...
使用 selenium-webdriver 开发 Web 自动 UI 测试程序
优缺点 优点 有时候有可能一个改动导致其他的地方的功能失去效果,这样使用 Web 自动 UI 测试程序可以快速的检查并定位问题,节省大量的人工验证时间 缺点 增加了维护成本,如果功能更新过快或者技术更新过快,维护成本也会随之提高…...
ffmpeg硬件编码
使用FFmpeg进行硬件编码可以显著提高视频编码的性能,尤其是在处理高分辨率视频时。硬件编码利用GPU或其他专用硬件(如Intel QSV、NVIDIA NVENC、AMD AMF等)来加速编码过程。以下是使用FFmpeg进行硬件编码的详细说明和示例代码。 1. 硬件编码支…...
脚本化挂在物理盘、nfs、yum、pg数据库、nginx(已上传脚本)
文章目录 前言一、什么是脚本化安装二、使用步骤1.物理磁盘脚本挂载(离线)2.yum脚本化安装(离线)3.nfs脚本化安装(离线)4.pg数据库脚本化安装(离线)5.nginx脚本化安装(离…...
// Error: line 1: XGen: Candidate guides have not been associated!
Maya xgen 报错// Error: line 1: XGen: Candidate guides have not been associated! 复制下面粘贴到Maya脚本管理器python运行: import maya.cmds as cmds def connect_xgen_guides():guide_nodes cmds.ls(typexgmMakeGuide)for node in guide_nodes:downstream…...
投机解码论文阅读:Falcon
题目:Falcon: Faster and Parallel Inference of Large Language Models through Enhanced Semi-Autoregressive Drafting and Custom-Designed Decoding Tree 地址:https://arxiv.org/pdf/2412.12639 一看它的架构图,可以发现它是基于EAGLE…...
OpenCV实现基于交叉双边滤波的红外可见光融合算法
1 算法原理 CBF是*Cross Bilateral Filter(交叉双边滤波)*的缩写,论文《IMAGE FUSION BASED ON PIXEL SIGNIFICANCE USING CROSS BILATERAL FILTER》。 论文中,作者使用交叉双边滤波算法对原始图像 A A A, B B B 进行处理得到细节࿰…...
Springboot整合WebService
1.1 概述 webservice 即 web 服务,因互联网而产生,通过 webservice 这种 web 服务,我们可以实现互联网应 用之间的资源共享,比如我们想知道 手机号码归属地,列车时刻表,天气预报,省市区邮…...
504 Gateway Timeout:网关超时解决方法
一、什么是 504Gateway Timeout? 1. 错误定义 504 Gateway Timeout 是 HTTP 状态码的一种,表示网关或代理服务器在等待上游服务器响应时超时。通俗来说,这是服务器之间“对话失败”导致的。 2. 常见触发场景 Nginx 超时:反向代…...
C++ 的 pair 和 tuple
1 std::pair 1.1 C 98 的 std::pair 1.1.1 std::pair 的构造 C 的二元组 std::pair<> 在 C 98 标准中就存在了,其定义如下: template<class T1, class T2> struct pair;std::pair<> 是个类模板,它有两个成员&#x…...
抢十八游戏
前言 我国民国一直流传着一个名叫“抢十八”的抢数游戏:参与游戏的两人从1开始轮流报数,每次至少报1个数,最多报2个数,每人报的每个数不得与自已报过的或对方报过的重复,也不得跳过任何一个数。谁先报到18,…...
从玩具到工业控制--51单片机的跨界传奇【2】
咱们在上一篇博客里面讲解了什么是单片机《单片机入门》,让大家对单片机有了初步的了解。我们今天继续讲解一些有关单片机的知识,顺便也讲解一下我们单片机用到的C语言知识。如果你对C语言还不太了解的话,可以看看博主的C语言专栏哟ÿ…...
LLM实现视频切片合成 前沿知识调研
1.相关产品 产品链接腾讯智影https://zenvideo.qq.com/可灵https://klingai.kuaishou.com/即梦https://jimeng.jianying.com/ai-tool/home/Runwayhttps://aitools.dedao.cn/ai/runwayml-com/Descripthttps://www.descript.com/?utm_sourceai-bot.cn/Opus Cliphttps://www.opu…...
学习threejs,使用FlyControls相机控制器
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.FlyControls 相机控制…...
wordpress 房产网站筛选功能
自定义分类法创建 add_action( init, ashu_post_type ); function ashu_post_type() {register_taxonomy(province,post,array(label => 省,rewrite => array( slug => province ),hierarchical => true));register_taxonomy(city,post,array(label => 市,rewr…...
SQL面试题2:留存率问题
引言 场景介绍: 在互联网产品运营中,用户注册量和留存率是衡量产品吸引力和用户粘性的关键指标,直接影响产品的可持续发展和商业价值。通过分析这些数据,企业可以了解用户行为,优化产品策略,提升用户体验…...
Redis是单线程还是多线程?
大家好,我是锋哥。今天分享关于【Redis是单线程还是多线程?】面试题。希望对大家有帮助; Redis是单线程还是多线程? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Redis是 单线程 的。 尽管Redis的处理是单线程的&a…...
mysql 变量,流程控制与游标
第16章_变量,流程控制与游标 1.变量 分为系统变量和用户自定义变量 1.1系统变量 1.1.1系统变量分类 系统变量分为全局系统变量以及会话系统变量 查看所有全局变量 SHOW GLOBAL VARIABLES 查看所有会话变量 SHOW SESSION VARIABLESor SHOW VARIABLES #默认是会话变量 …...
Java配置log4j日志打印
1. 引入依赖 <dependencies><!-- Log4j 2依赖 --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>1.2.14</version> <!-- 可以根据需要修改版本 --></…...
什么是SQL?
什么是SQL? SQL(Structured Query Language,结构化查询语言)是一种用于与关系型数据库进行交互的标准编程语言。SQL 是设计用于管理和操作关系型数据库的语言,主要用于查询、插入、更新、删除和定义数据结构。SQL 是关…...
Linux 机器学习
Linux 机器学习是指在 Linux 操作系统环境下进行机器学习相关的开发、训练和应用。 具体步骤 环境搭建: 选择合适的 Linux 发行版:如 Ubuntu、Fedora、Arch Linux 等。Ubuntu 因其易用性和丰富的软件包管理系统,适合初学者;Fed…...