Python语法进阶学习--模块和包

在学习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 包名或模块名

注意:

  1. 安装第三方的包和模块是在 python 解释器安装目录的 Lib/site-packages 下面
  2. 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代码的时候,常常需要导入一些模块和包,下面是导入模块和包的几种方式。
Python语法进阶学习--模块和包_第1张图片
假设有一个包(包的名字: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 = 666

def foo():
    return my_int

def 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__属性影响

你可能感兴趣的:(python,学习,开发语言,模块和包)