Python 模块与包

2023-11-18

1. 模块

  • 一个模块就是一个包含python代码的文件,后缀名称是.py就可以,模块就是个python文件
  • 为什么我们用模块
    • 程序太大,编写维护非常不方便,需要拆分
    • 模块可以增加代码重复利用的方法
    • 当作命名空间使用,避免命名冲突
  • 如何定义模块
    • 模块就是一个普通文件,所以任何代码可以直接书写
    • 不过根据模块的规范,最好在本块中编写以下内容
      • 函数(单一功能)
      • 类(相似功能的组合,或者类似业务模块)
      • 测试代码
  • 如何使用模块
    • 模块直接导入

      • 模块名称直接以数字开头,需要借助importlib帮助
    • 语法

      import module_name module_name.function_name module_name.class_name

    • 案例 01.py,02.py,p01.py,p02.py

        # 案例 01.py
    	# 包含一个学生类
    	# 一个sayHello函数
    	# 一个打印语句
    
    	class Student():
    	    def __init__(self, name = "NoName", age = 18):
    	        self.name = name
    	        self.age = age
    	
    	    def say(self):
    	            print("My name is {0}".format(self.name))
    	
    	def sayHello():
    	    print("Hi, ")
    	
    	print("我是模块p0")
    	
    复制代码
    	# 案例 02.py
    	# 借助于importlib包可以实现导入以数字开头的模块名称
    	import importlib
    	
    	# 相当于导入了一个叫01的模块并把导入模块赋值给了a
    	
    	a = importlib.import_module("01")
    	stu = a.Student()
    	stu.say()
    复制代码
    	# 案例 p01.py
    	# 包含一个学生类
    	# 一个sayHello函数
    	# 一个打印语句
    	
    	class Student():
    	    def __init__(self, name = "NoName", age = 18):
    	        self.name = name
    	        self.age = age
    	
    	    def say(self):
    	            print("My name is {0}".format(self.name))
    	
    	def sayHello():
    	    print("Hi, ")
    	
    	# 此判断语句建议一直作为程序的入口
    	if __name__ == '__main__':
    	    print("我是模块p01")
    复制代码
    	# 案例 p02.py
    	import p01
    	
    	stu = p01.Student("xiaojing", 19)
    	
    	stu.say()
    	
    	p01.sayHello()
    复制代码
      	My name is xiaojing
      	Hi, 
    复制代码
    • import 模块 as 别名
      • 导入的同时给模块起一个别名
      • 其余用法跟第一种相同
      • 案例 p03.py
        # 案例 p03.py
    	import p01 as p
    	
    	stu = p.Student("yueyue", 18)
    	stu.say()
    复制代码
      	My name is yueyue
    复制代码
    • from module_name import func_name, class_name
      • 按上述方法有选择性的导入
      • 使用的时候可以直接使用导入的内容,不需要前缀
      • 案例 p04
    	# 案例 p04.py
    	from p01 import Student, sayHello
    	
    	stu = Student()
    	
    	stu.say()
    	
    	sayHello()
    复制代码
        My name is NoName
        Hi,    
    复制代码
    • from module_name import *
      • 导入模块所有内容
      • 案例 p05.py
       	# 案例 p05.py
    	from p01 import *
    	
    	sayHello()
    	
    	stu = Student("yaona", 20)
    	stu.say()
    复制代码
      	Hi, 
      	My name is yaona
    复制代码
  • if __name__ == ``__main__ 的使用
    • 可以有效的避免模块代码被导入的时候被动执行的问题
    • 建议所有程序的入口都以此代码为入口

2. 模块的搜索路径和存储

  • 什么是模块的搜索路径

    • 加载模块的时候,系统会在哪些地方寻找此模块
  • 系统默认的模块搜索路径

      import sys
      sys.path  属性可以获取路径列表
      # 案例 p06.py
    复制代码
    	# 案例 p06.py
    	import sys
    	
    	print(type(sys.path))
    	print(sys.path)
    	
    	for p in sys.path:
    	    print(p)
    复制代码
      		<class 'list'>
      	['D:\\python\\project\\包管理', 'D:\\PyCharm Community Edition 2019.1.1\\helpers\\pydev', 'D:\\python\\project', 'D:\\PyCharm Community Edition 2019.1.1\\helpers\\third_party\\thriftpy', 'D:\\PyCharm Community Edition 2019.1.1\\helpers\\pydev', 'C:\\Users\\user\\.PyCharmCE2019.1\\system\\cythonExtensions', 'D:\\python\\project\\包管理', 'D:\\Anaconda3\\envs\\opp\\python37.zip', 'D:\\Anaconda3\\envs\\opp\\DLLs', 'D:\\Anaconda3\\envs\\opp\\lib', 'D:\\Anaconda3\\envs\\opp', 'D:\\Anaconda3\\envs\\opp\\lib\\site-packages']
      	D:\python\project\包管理
      	D:\PyCharm Community Edition 2019.1.1\helpers\pydev
      	D:\python\project
      	D:\PyCharm Community Edition 2019.1.1\helpers\third_party\thriftpy
      	D:\PyCharm Community Edition 2019.1.1\helpers\pydev
      	C:\Users\user\.PyCharmCE2019.1\system\cythonExtensions
      	D:\python\project\包管理
      	D:\Anaconda3\envs\opp\python37.zip
      	D:\Anaconda3\envs\opp\DLLs	
      	D:\Anaconda3\envs\opp\lib
      	D:\Anaconda3\envs\opp
      	D:\Anaconda3\envs\opp\lib\site-packages
    复制代码
  • 添加搜索路径

      sys.path.append(dir)
    复制代码
  • 模块的加载顺序

    1. 搜索内存中已经加载好的模块
    2. 搜索python的内置模块
    3. 搜索sys.path路径

  • 包是一种组织管理代码的方式,包里面存放的是模块

  • 用于将模块包含在一起的文件夹就是包

  • 自定义包的结构

      |---包
      |---|---  __init__.py  包的标志文件
      |---|---  模块1
      |---|---  模块2
      |---|---  子包(子文件夹)
      |---|---|---  __init__.py
      |---|---|---  子包模块1
      |---|---|---  子包模块2
      
    复制代码
  • 包的导入操作

    • import package_name
      • 直接导入一个包,可以使用__init__.py中的内容

      • 使用方式是:

          package_name.func_name
          package_name.class_name.func_name()
        复制代码
      • 此种方式的访问内容是

      • 案例 pkg01, p07.py

    	# pkg01.__init__py
    	def inInit():
    	    print("I am in init of package")
    
    	# pkg01.p01.py
    	class Student():
    	    def __init__(self, name = "NoName", age = 18):
    	        self.name = name
    	        self.age = age
    	
    	    def say(self):
    	            print("My name is {0}".format(self.name))
    	
    		def sayHello():
    		    print("Hi, ")
    
    
    	print("我是模块p01")
    复制代码
    	# 案例 p07.py
    	import pkg01
    	
    	pkg01.inInit()
    复制代码
      	I am in init of package
      
    复制代码
    • import package_name as p
      • 具体用法跟作用方式,跟上述简单导入一致
      • 注意的是此种方法是默认对__init__.py内容的导入
    • import package.module
      • 导入包中某一个具体的模块

      • 使用方法

          package.module.func_name
          package.module.class.fun()
          package.module.class.var
        复制代码
      • 案例 p08.py

    	# 案例 p08.py
    	import pkg01.p01
    	
    	stu = pkg01.p01.Student()
    	stu.say()
    复制代码
      	我是模块p01
      	My name is NoName
      
    复制代码
    • import package.module as pm
  • from ... import 导入

    • from package import module1, module2, module3, ... ...

    • 此种导入方法不执行 __init__ 的内容

        from pkg01 import p01
        p01.sayHello()
      复制代码
    • from package import *

      • 导入当前包 __init__.py 文件中所有的函数和类

      • 使用方法

          func_name()
          class_name.func_name()
          class_name.var
          
        复制代码
      • 案例 p09.py, 注意此种导入的具体内容

    	# 案例 p09.py
    	from pkg01 import *
    	
    	inInit()
    	
    	stu = Student() 
    复制代码
      	I am in init of package
      	
      	NameError: name 'Student' is not defined
    复制代码
  • from package.module import *

    • 导入包中指定的模块的所有内容

    • 使用方法

        func_name()
        class_name.func_name()
        
      复制代码
  • 在开发环境中经常会引用其他模块,可以在当前包中直接导入其他模块中的内容

    • import 完整的包或者模块的路径
  • __all__ 的用法

    • 在使用from package import * 的时候,* 可以导入的内容
    • __init__.py 中如果文件为空,或者没有 __all__, 那么只可以把 __init__ 中的内容导入
    • __init__ 如果设置了 __all__ 的值,那么则按照 __all__ 指定的子包或者模块进行加载

    如此则不会载入 __init__ 中的内容

    • __all__=['module1', 'module2', 'package1'... ...]
    • 案例 pkg02,p10.py
    	# pkg02.__init__.py
    	__all__=['p01']
    	
    	def inInit():
    	    print("T am in init of package")
    
    	# pkg02.p01.py
    	class Student():
        	def __init__(self, name = "NoName", age = 18):
            	self.name = name
            	self.age = age
    
        	def say(self):
                print("My name is {0}".format(self.name))
    	
    		def sayHello():
    	    	print("Hi, ")
    	
    	# 此判断语句建议一直作为程序的入口
    	if __name__ == '__main__':
    	    print("我是模块p01")
    复制代码
    	# 案例 p10.py
    	from pkg02 import *
    	
    	stu = p01.Student()
    	stu.say()
    复制代码
      My name is NoName
    复制代码

命名空间

  • 用于区分不同位置不同功能但相同名称的函数或者变量的一个特定前缀

  • 作用是防止命名冲突

      setName()
      Student.setName()
      Dog.setName()

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 模块与包 的相关文章

随机推荐

  • 如何防止CSRF攻击

    随着互联网的高速发展 信息安全问题已经成为企业最为关注的焦点之一 而前端又是引发企业安全问题的高危据点 在移动互联网时代 前端人员除了传统的 XSS CSRF 等安全问题之外 又时常遭遇网络劫持 非法调用 Hybrid API 等新型安全问
  • Lunece全文检索搜索引擎

    Lunece全文检索 1 什么是全文检索 lucene是apache软件基金会4 jakarta项目组的一个子项目 是一个开放源代码的全文检索引擎工具包 但它不是一个完整的全文检索引擎 而是一个全文检索引擎的架构 提供了完整的查询引擎和索引
  • Postman如何做接口测试,那些不得不知道的技巧

    目录 导读 前言 Postman如何做接口测试1 如何导入 swagger 接口文档 Postman如何做接口测试2 如何切换测试环境 Postman如何做接口测试3 什么 postman 还可以做压力测试 Postman如何做接口测试4
  • substance designer中的warp节点分析

    一直觉得warp挺适用 但是用起来有时候效果挺奇怪的 还有directional warp貌似两个产生的效果截然不同 于是尝试用u3d 材质实现下 directional warp 这个节点主要功能是用灰度信息推开像素 常常用来分割连续贴图
  • Ubuntu安装配置tftp服务器

    Ubuntu安装配置tftp服务器 实验环境 ubuntu 1604 x64 一 安装配置 建立tftp目录 sudo mkdir tftpboot sudo chmod 777 tftpboot 安装客户端和服务器 sudo apt ge
  • 大数据量的冒泡排序 (计次数)

    题目描述 给定一个包含从0到n 1各一次的数组 若使用冒泡排序将其排为升序 问其中需要进行多少次交换 输入 测试数据有多组 每组由两行组成 第一行包含正整数n n lt 5000 下一行包含从0到n 1的n个整数的序列 输出 对于每组测试数
  • [论文分享] Adversarial Training for Raw-Binary Malware Classifiers

    Adversarial Training for Raw Binary Malware Classifiers USENIX 2023 Keane Lucas Carnegie Mellon University Samruddhi Pai
  • 面试题61. 扑克牌中的顺子(java+python)

    从若干副扑克牌中随机抽 5 张牌 判断是不是一个顺子 即这5张牌是不是连续的 2 10为数字本身 A为1 J为11 Q为12 K为13 而大 小王为 0 可以看成任意数字 A 不能视为 14 示例 1 输入 1 2 3 4 5 输出 Tru
  • hex文件格式学习记录

    hex文件 hex文件是什么 hex文件的数据结构 按照记录类型具体分析 Mermaid Flowchart hex文件是什么 它是由一行行符合Intel HEX 文件格式的文本所构成的ASCII 文本文件 每一行包含一 个 HEX 记录
  • Java实验三 基于GUI的网络通信程序设计【代码构建逻辑】【双向通信】【超多细节优化!!】

    写在前面 这次实验代码的构建主要是更加熟练的运用socket网络编程 文件输入输出流 GUI设计 容器的使用 多线程的运用等等多方面的知识 是综合类题型 做完受益身心的类型 题目如下 编写程序完成以下功能 1 设计一个基于GUI的客户 服务
  • iOS的几个特效实现思路

    最近看一个app的源码 发现基本没有用第三方的开源组件 但是特效也做得不错 总结一下实现的思路 简单的抽屉效果 效果如图 这种抽屉效果很常见 开源组件也很多 但是一般开源组件都对Controller的结构有要求 有时候不是很方便 原理主要是
  • qmake手册(Qt5.9.3)

    qmake手册 qmake手册 概观 描述一个项目 建立一个项目 使用第三方库 预编译头文件 入门 从简单的开始 使应用程序可调试 添加平台特定的源文件 如果文件不存在停止qmake 检查多个条件 创建项目文件 项目文件元素 变量 注释 内
  • 小程序报错:Unexpected end of JSON input

    报错原因 跳转页面传参内包含英文 let data aaa 你学会了吗 由于参数内携带英文 所以报错 wx navigateTo url home home data encodeURI JSON stringify data 解决方法 先
  • ECCV20 - OCRNet:聚合对象上下文特征用于语义分割《Object-Contextual Representations for Semantic Segmentation》

    文章目录 原文地址 论文阅读方法 初识 相知 主要技术 部分实验 回顾 原文地址 原文 论文阅读方法 三遍论文法 初识 对于语义分割这类密集预测任务 上下文特征是非常重要的信息 在早期的一些工作中 主要着重于捕获多尺度特征 空间维度 比如P
  • Golang学习笔记 结构体和指针

    Golang是一门很特殊的语言 虽然它出生比较晚 但是在很多地方却和现在的编程语言有所不同 现在的编程语言要么是函数式的 要么是面向对象的 而Go语言却有指针 结构体这些概念 并解决了C语言的一些坑 从这个角度上说 Golang可以看做C语
  • 【mysql】-【innodb数据存储结构】

    文章目录 数据库的存储结构 页 磁盘与内存交互基本单位 页 页结构概述 页的大小 页的上层结构 页的内部结构 File Header 文件头部 和File Trailer 文件尾部 File Header 文件头部 38字节 File Tr
  • Vue3-导出excel表格

    安装xlsx和file saver yarn add file saver xlsx 或 npm install file saver S npm install xlsx S 页面引入xlsx和file saver import as X
  • 不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事...

    文章授权转载自视觉志 版权归原作者所有 作者 不一 2009年 19岁的孙玲和朋友一起 坐上了前往深圳的绿皮火车 经过14个小时的疲倦车程 她有了一个全新的身份 工厂车间 流水线上的一名女工 那个时候 如果有人告诉孙玲 你以后会成为一名优秀
  • 无限创建gmail邮箱账号

    文章目录 说明 准备工作 操作方法 1 用户名之间加 2 用户名后面加 3 把后缀变为http googlemail com 说明 国外很多网站都需要gmail邮箱注册 如果能有很多gmail账号 那么就能做很多事 自己体会哈 注册地址 h
  • Python 模块与包

    1 模块 一个模块就是一个包含python代码的文件 后缀名称是 py就可以 模块就是个python文件 为什么我们用模块 程序太大 编写维护非常不方便 需要拆分 模块可以增加代码重复利用的方法 当作命名空间使用 避免命名冲突 如何定义模块