目录
- python中的组织结构:包、模块、类
- 关于模块与变量的导入
- __init__.py的作用
- 包与模块的几个常见错误
- 模块的内置变量
- 入口文件和普通模块在内置变量的区别
- __name__的经典应用
- 相对导入、绝对导入
五、模块的内置变量
即系统定义的变量。本质与自己定义的变量是一样的。
为好理解,模块可以被看作文件,但不是真的文件。因为模块有内置变量,而文件只是个文件。
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 #最典型的特征之三
Comments | NOTHING