IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python包和模块的学习 -> 正文阅读

[Python知识库]python包和模块的学习

以下为我自己做的实验和对书籍的摘抄

在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

  • 注意上述的第三段给出的解释可能有些迷惑,简单的说.__doc__只能输出第一个字符串(后面说的“首行… 第二行是空行…”指的是一个多行字符串,多行字符串使用三个引号包裹),这个字符串可以是多行字符串, 逻辑行大概意思就是代码开始的第一行(空白行不算行,剩余的行就是第一行)下面给出实验!
(base) skt1faker@SKT1Faker:~/my_procedure/python/package_study$ cat mm.py 
import package

print(package.module1.__doc__)
print(package.module1.printf.__doc__)	# 注意这里不是printf().__doc__


(base) skt1faker@SKT1Faker:~/my_procedure/python/package_study$ cat package/module1.py 



"""hello

f afa
s f
a
f a
f
a
f
a

"""
def printf():

	"""
	用来输出
	lsfaklklas 
	fasklfhsjafkhjkhsf
	hsdajkhfajsfhak
	hsjafkhjk
	"""
	print("in module1")
print("scv jiu xu ")
(base) skt1faker@SKT1Faker:~/my_procedure/python/package_study$ 

(base) skt1faker@SKT1Faker:~/my_procedure/python/package_study$ python mm.py 
scv jiu xu 
in __init__.py
hello

f afa
s f
a
f a
f
a
f
a


	用来输出
	lsfaklklas 
	fasklfhsjafkhjkhsf
	hsdajkhfajsfhak
	hsjafkhjk

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述注意导入包的时候只有__init__.py中的全局代码运行,包中的其他模块不会因为导包而被运行全局代码,但是如果__init__.py中导入了包内的模块那么仅有被导入的模块中的全局代码会被运行。
__init__.py未导入其他模块

(base) skt1faker@SKT1Faker:~/my_procedure/python/package_study/package$ cat module2.py 
def printf():
	print("in module2")
printf()
(base) skt1faker@SKT1Faker:~/my_procedure/python/package_study/package$ cat __init__.py 
# from . import module1
# from . import module2
# 这里没有导入module1和module2

print("in __init__.py")
(base) skt1faker@SKT1Faker:~/my_procedure/python/package_study/package$ cd ../
(base) skt1faker@SKT1Faker:~/my_procedure/python/package_study$ ls
mm.py  package
(base) skt1faker@SKT1Faker:~/my_procedure/python/package_study$ python mm.py 
in __init__.py

__init__.py导入了其他模块!

base) skt1faker@SKT1Faker:~/my_procedure/python/package_study/package$ cat __init__.py 
from . import module1
from . import module2
# 加入了其他两个模块

print("in __init__.py")
(base) skt1faker@SKT1Faker:~/my_procedure/python/package_study/package$ cat module1.py 
def printf():
	print("in module1")
printf()
(base) skt1faker@SKT1Faker:~/my_procedure/python/package_study/package$ cat module2.py 
def printf():
	print("in module2")
printf()
(base) skt1faker@SKT1Faker:~/my_procedure/python/package_study/package$ cd ../
(base) skt1faker@SKT1Faker:~/my_procedure/python/package_study$ python mm.py 
in module1
in module2
in __init__.py

但是,如果__init__.py中不导入其他模块,那么以上面mm.py文件为例,我们是无法使用package.module1这种用法

(base) skt1faker@SKT1Faker:~/my_procedure/python/package_study$ cat package/__init__.py 
# from . import module1
# from . import module2


print("in __init__.py")

(base) skt1faker@SKT1Faker:~/my_procedure/python/package_study$ python mm.py 
in __init__.py
Traceback (most recent call last):
  File "mm.py", line 3, in <module>
    package.module1.pritnf()
AttributeError: module 'package' has no attribute 'module1'

这个时候,直接改变__init__.py文件为如下即可

(base) skt1faker@SKT1Faker:~/my_procedure/python/package_study$ cat package/module1.py 
def printf():
	print("in module1")
print("scv jiu xu ")

(base) skt1faker@SKT1Faker:~/my_procedure/python/package_study$ cat package/__init__.py 
from . import module1
# from . import module2
print("in __init__.py")

(base) skt1faker@SKT1Faker:~/my_procedure/python/package_study$ python mm.py 
scv jiu xu 
in __init__.py
in module1

在这里插入图片描述在这里插入图片描述* 列举当前模块中的所有成员
在这里插入图片描述* 列举模块的成员
在这里插入图片描述* 列举成实例的成员
在这里插入图片描述* 列举类的成员
在这里插入图片描述

命名空间

在一个 Python 程序中的任何一个地方,都存在几个可用的命名空间。
1、每个函数都有着自已的命名空间,叫做局部命名空间,它记录了函数的变量,包括函数的参数和局部定义的变量。
2、每个模块拥有它自已的命名空间,叫做全局命名空间,它记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
3、还有就是内置命名空间,任何模块均可访问它,它存放着内置的函数和异常。

命名空间查找顺序

  • 变量的查找顺序
    当一行代码要使用变量 x 的值时,Python 会到所有可用的名字空间去查找变量,按照如下顺序:
    1、局部命名空间:特指当前函数或类的方法。如果函数定义了一个局部变量 x,或一个参数 x,Python 将使用它,然后停止搜索。
    2、全局命名空间:特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python 将使用它然后停止搜索。
    3、内置命名空间:对每个模块都是全局的。作为最后的尝试,Python 将假设 x 是内置函数或变量。
    4、如果 Python 在这些名字空间找不到 x,它将放弃查找并引发一个 NameError 异常,如,NameError: name ‘aa’ is not defined。

  • 函数的查找顺序:(注意函数可以嵌套,一个函数中可以定义另一个函数,这样就有父函数这个名字)
    1、先在当前 (嵌套的或 lambda) 函数的命名空间中搜索
    2、然后是在父函数的命名空间中搜索
    3、接着是模块命名空间中搜索
    4、最后在内置命名空间中搜索

对于命名空间的讲解这篇文章讲的很不错,我也是参考了他的一部分

包内模块导入(绝对导入和相对导入)

绝对导入和相对导入的区别

绝对导入就是将要导入的模块路径导入到sys.path

import sys
sys.path.append("绝对路径")

相对导入就是使用from . import 包,其中“."可以换为“…”,“…”
一般来讲,我们在包内使用相对导入,在程序中使用绝对导入
未完

-----------------未完----------------------

参考:

  1. python程序设计预算法基础教程,江红,余青松 清华大学出版社
  2. Python命名空间的本质–奔跑的小邵
  3. Python基础(2):doc、文档字符串docString、help()-- 快乐的凡人721
  4. 包内模块的导入
  5. 包内导入实验
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-01-11 23:57:04  更:2022-01-11 23:59:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 4:51:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码