以下为我自己做的实验和对书籍的摘抄
     
- 注意上述的第三段给出的解释可能有些迷惑,简单的说
.__doc__ 只能输出第一个字符串(后面说的“首行… 第二行是空行…”指的是一个多行字符串,多行字符串使用三个引号包裹),这个字符串可以是多行字符串, 逻辑行大概意思就是代码开始的第一行(空白行不算行,剩余的行就是第一行)下面给出实验!
(base) skt1faker@SKT1Faker:~/my_procedure/python/package_study$ cat mm.py
import package
print(package.module1.__doc__)
print(package.module1.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
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
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
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 包 ,其中“."可以换为“…”,“…” 一般来讲,我们在包内使用相对导入,在程序中使用绝对导入 未完
-----------------未完----------------------
参考:
- python程序设计预算法基础教程,江红,余青松 清华大学出版社
- Python命名空间的本质–奔跑的小邵
- Python基础(2):doc、文档字符串docString、help()-- 快乐的凡人721
- 包内模块的导入
- 包内导入实验
|