04 包与模块之三


目录

  1. python中的组织结构:包、模块、类
  2. 关于模块与变量的导入
  3. __init__.py的作用
  4. 包与模块的几个常见错误
  5. 模块的内置变量
  6. 入口文件和普通模块在内置变量的区别
  7. __name__的经典应用
  8. 相对导入、绝对导入

五、模块的内置变量

即系统定义的变量。本质与自己定义的变量是一样的。
为好理解,模块可以被看作文件,但不是真的文件。因为模块有内置变量,而文件只是个文件。

1.模块的变量
分两种

seven/c14.py
a = 2
c = 3
d = 5    #自己定义的变量

infos = dir()   #dir()是内置函数:列出该对象所有的属性和方法
#如果不传入参数,那就是返回当前模块下所有的变量
print(infos)

-->
['__annotations__', '__builtins__', '__cached__', '__doc__',
 '__file__', '__loader__', '__name__', '__package__','__spec__',  #双下划线:系统的内置变量
 'a', 'c', 'd']    #自己定义的变量
  • 补充:dir()函数的用法
import sys    #导入内置的模块
infos = dir(sys)   #如果传入参数,就是查看指定模块/类/对象下的变量   #查看sys下所有变量
print(infos)

-->
[...]

dir()函数编程用的少,但是写基础框架会用到。

2.四个常见的内置变量的作用

(1) __name__ 、__package__ 、__file__

seven/t/c9.py
print('name: '+__name__)
print('package: '+__package__)
print('doc: '+__doc__)    #str不能与Nonetype类型相加,因为注释不存在
print('file: '+__file__)

seven/c15.py
import t.c9

-->python c15.py
name: t.c9    #完整的限定名称
package: t    #所在的包
doc: error:❌
file: D:\python\seven\t\c9.py   #当前模块在系统里面的物理路径
关于学会看异常错误信息
traceback:错误的堆栈信息
TypeError:错误的具体信息——初学者建议关注这个,错误小总结

(2) __doc__

seven/t/c9.py
'''                 #多行字符串的形式
This is a c9 doc    #加了模块注释:功能和作用的总体描述   #方便别人
'''
print('name: '+__name__)
print('package: '+__package__)
print('doc: '+__doc__)
print('file: '+__file__)

seven/c15.py
import t.c9

-->python c15.py
name: t.c9
package: t
doc: This is a c9 doc     #模块注释
file: D:\python\seven\t\c9.py 

(3) 若加个子包t1呢:

seven/t/t1/c9.py     #多了个子包t1
'''
This is a c9 doc    
'''
print('name: '+__name__)
print('package: '+__package__)
print('doc: '+__doc__)
print('file: '+__file__)

seven/c15.py
import t.t1.c9

-->python c15.py
name: t.t1.c9    #多了个子包t1
package: t.t1    #多了个子包t1
doc: This is a c9 doc
file: D:\python\seven\t\t1\c9.py     #多了个子包t1 

六、普通模块和入口文件在内置变量的区别

1.以普通模块:c9.py 和入口文件:c15.py 为例,比较两者的差异:

seven/t/t1/c9.py   
'''
This is a c9 doc    
'''
print('name: '+__name__)
print('package: '+__package__) 
print('doc: '+__doc__)
print('file: '+__file__)

seven/c15.py     #c15是执行文件
import t.t1.c9
print('package: '+__package__)   #str不能与Nonetype类型相加,因为包不存在
print('name: '+__name__)
print('doc: '+__doc__)   #str不能与Nonetype类型相加,因为本模块注释不存在
print('file: '+__file__)

-->python c15.py
error package出错❌
error doc出错❌
条件表达式
其他语言:三元表达式:a = 5 > 3 ? 1 : 0 ——不直观
python没有:用if else 代替。这里用之前学习的 or 逻辑运算符 ——简洁、易懂

2.根据bool(None)-->False,利用or的特性,改正。比较两者的差异:

seven/t/t1/c9.py   
'''
This is a c9 doc    
'''
print('name: '+__name__)
print('package: '+__package__)
print('doc: '+__doc__)
print('file: '+__file__)

seven/c15.py
import t.t1.c9
print('~~~~~~~~c15~~~~~~~~')
print('name: '+__name__)
print('package: '+(__package__ or '当前模块不属于任何包'))  # or:前者函数有值,一定返回该值;如果没值,一定返回后者。妙啊!
print('doc: '+(__doc__ or '当前模块没有文档注释'))
print('file: '+__file__)

-->python c15.py         #执行命令所在的目录
                               #普通模块:
name: t.t1.c9   
package: t.t1    
doc: This is a c9 doc
file: D:\python\seven\t\t1\c9.py 

~~~~~~~~c15~~~~~~~~ #为什么上下会有如此大的差异呢?
                                #入口文件:
name: __main__                #最典型的特征之一
package: 当前模块不属于任何包  #最典型的特征之二
doc: 当前模块没有文档注释
file: c15.py                  #最典型的特征之三   #与执行命令所在的目录有关

3.换个思路证明两者的差异:直接运行 c9.py
普通模块:c9.py vs 入口文件:c9.py

seven/t/t1/c9.py   
'''
This is a c9 doc    
'''
print('name: '+__name__)
print('package: '+(__package__ or '当前模块不属于任何包'))
print('doc: '+__doc__)
print('file: '+__file__)

-->python c9.py
name: __main__                #最典型的特征之一
package: 当前模块不属于任何包  #最典型的特征之二
doc: This is a c9 doc 
file: c9.py                   #最典型的特征之三

声明:Jerry's Blog|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 04 包与模块之三


Follow excellence, and success will chase you.