在学习python进阶知识中的面向对象之前,还要了解一下当中几个概念:包、模块、类和函数。
一.模块和包
模块和包:用来组织Python代码的。
- 包 => 含有
__init__.py
文件的文件夹- 模块 => py文件
- 类 => class 【面向对象学习】
- 函数(方法)=> def
以上均不能以数字开头,也不能和python内置的一切重名
1.1包是具有特殊文件的文件夹
当我们使用一个包时,这个包目录下的__init__.py文件中的代码会自动执行。
包的 init 文件中,也可以设置 all 内置变量,限定 from 包名 import *
时默认导入的模块。
平时沟通时,包和模块的概念往往不区分
包和模块都存在内置的第三方的区别,第三方的就是玩家自己写的、非Python官方的
第三方包需要额外安装
安装命令:
pip install 包名或模块名 -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install 包名或模块名==版本号
pip install 包名或模块名
卸载命令:pip uninstall 包名或模块名
注意:
- 安装第三方的包和模块是在 python 解释器安装目录的 Lib/site-packages 下面
- python虚拟环境和默认环境 需要各自安装各自的三方包!
安装到指定的py虚拟环境下 /虚拟环境路径/python -m pip install 包名或模块名
默认安装到默认python下:pip install 包名或模块名
1.2 模块的搜索路径
一切以被运行的python文件所在的路径为准,是工作路径,同时也是相对路径的起点
import sys
print(sys.path)
"""
sys.path可以说明:
运行py代码时,Python解释器会自动搜索要使用的模块
会自动向以下两个路径进行搜索:
1. 当前工作路径
2. Python虚拟环境路径还可以手动添加导包环境路径:
import sys
sys.path.append('要导包的位置')注意:自定义的一切变量、函数、类、模块、包,都不要和python内置的一切重名!
"""
二.模块和包的使用
在我们写Python代码的时候,常常需要导入一些模块和包,下面是导入模块和包的几种方式。
假设有一个包(包的名字:my_module),包里面会有一个__init__.py文件,在里面再创建自己的模块py文件(名字:my_module),文件里面有自己写的func_1函数。
方式一:import 模块名
示例:
import my_module
print(my_module.func_1(1,2))
print(my_module.arg_a)
方式二:from 模块 import 函数
示例:
from my_module import func_1,arg_a
print(func_1(2,3))
print(arg_a)
方式三:用 as关键字 起别名
示例1:
import os as winos
ret = winos.listdir()
print(ret)
示例2:
from os import listdir as win_listdir
ret = win_listdir()
print(ret)
方式四:(不推荐)from 模块名 import *
原因如下:
1- 不方便阅读
2- 如果有多个导入,会导致重名的问题
3- 配合__all__使用,会有使用限制
三.__name__
属性
只有运行入口的py文件(模块)的
__name__
是__main__
,其他被引用的文件(模块)的__name__
是不带扩展名的文件名
下边的a.py和b.py两个文件,在同一目录中!
a.py
- 运行该文件
print("a模块的name属性值",__name__)if __name__ == '__main__':print("对数据库中数据删除的操作")
b.py
print(__name__)if __name__ == '__main__':# 如果被其他py文件引用,这里将不会执行# 因为被引用时,b.py的__name__是 b,而不是__main__# 只有b.py作为主文件运行时,b的__name__才是__main__print('bbbb')print(__name__)
__name__属性总结
1- 代码中一般都会写下面的判断语句,也就是if __name__ == '__main__':
2- 该判断,是用来限定某些代码只在执行该模块代码的时候才执行。一般放的是测试代码,或者是整个程序的入口函数
四.__all__
属性
如果一个py文件(模块)中有
__all__
变量(list类型),当其他py文件(模块)使用from 模块名 import *
引用它时,只能导入这个列表中指定的内容
a.py
__all__ = ['foo', 'my_int'] my_int = 666def foo():return my_intdef bar():return 777
b.py
- 运行该文件
# from a import *
#
# print(my_int)
# print(foo())
# print(bar())from a import my_int,foo,bar
print(my_int)
print(foo())
print(bar())
__all__属性总结
1- __all__是一个列表,用来控制其他导入的时候,使用权限。需要配合import *
2- 如果在import中明确要导入的内容,那么是不受__all__属性影响