Python学习笔记(十):包、模块、类、函数/变量

一、包、模块

    Python中的包相当于文件夹,模块就是.py文件

    不同包下有相同名称的模块时,为了区分,可在模块里加上“包名.模块名”路径,这个路径叫做命名空间

    注:如果想让一个普通的文件夹变为包,则需要在这个文件夹内添加__init__.py文件,init前后各两个下划线,此文件的路径不是包名.文件名,而是包名

二、导入其它模块的变量

包设置如下图

Python学习笔记(十):包、模块、类、函数/变量

p5文件夹下新增c1.py

a = 2
b = 3
c = 4

p4文件夹下新增c2.py

      1)import 路径.模块名

         c2.py           

import p4.c1
print(T.C1.a)

     2)import 命名空间.模块名 as 标识名

import p4.c1 as c
print(c.a)
      引入其它模块运行后,会由python解释器自动生成一个__pycache__文件夹,里面包含引入的模块名.cpython-36.pyc文件

    3) 引入变量

        注:import只能引入模块,不能直接引入模块下的变量,可以使用“from 命名空间.模块名 import 变量名”来引入变量

        A.只引入需要的变量

        c2.py

from p5.c1 import a
from p5.c1 import b
print(a)
print(b)

        B.引入全部变量

from p5.c1 import *
print(a)
print(b)
print(c)

  C.使用from  命名空间 import 模块名,将模块看作一个变量来引入

c2.py

Python学习笔记(十):包、模块、类、函数/变量     

D.在c1.py中加入内置变量__all__,定义只可导入的变量

c1.py

__all__ = ['a', 'b']
a = 2
b = 3
c = 4

c2.py

from p5.c1 import *
print(a)
print(b)
print(c)

此时import *,只能导入__all__里含有的变量a和b,不能导入c,因此运行会报错

    print(c)

NameError: name 'c' is not defined

注:使用内置变量后,只是使用“from ... import *”时,只能导入内置变量的元素,未被归入内置变量的元素,仍可单独导入成功,即

c2.py

from p5.c1 import *
from p5.c1 import c
print(a)
print(b)
print(c)

此时会运行成功,打印

2
3

4

三、vscode的小技巧

3.1隐藏__pycache__文件夹,在用户设置中搜file.exclude,加入"**/__pycache__":true,即可隐藏该文件夹

Python学习笔记(十):包、模块、类、函数/变量


3.2换行

    注:python中建议一行最多有80个字符

3.2.1  可以在一行的末尾加入“\”

Python学习笔记(十):包、模块、类、函数/变量

3.2.2 将需要换行的内容用()括起来

Python学习笔记(十):包、模块、类、函数/变量

3.3将可执行文件作为一个普通模块来执行,可以使用命令: python -m 命名空间.模块

     不使用-m时,python后面加的是物理路径 

四、__init__.py文件

4.1 一个文件夹下有__init__.py文件时,这个文件夹就会变为包,如果没有此文件就是一个普通的文件夹

4.2 当一个包被导入时,__init__.py文件会被自动执行

      在p5下添加__init__.py文件,并加入一行打印信息代码,运行c2.py

Python学习笔记(十):包、模块、类、函数/变量

        注:一般在__init__.py文件添加初始化信息

4.3 可以在文件中添加内置变量,规定哪些模块可以被引出

在p5文件夹下添加c3.py文件

Python学习笔记(十):包、模块、类、函数/变量

__init__.py中,添加内置变量,规定只可对c1导出

Python学习笔记(十):包、模块、类、函数/变量

c2.py文件中,导入c3,并执行

Python学习笔记(十):包、模块、类、函数/变量               

注:__init__.py中的内置变量同样只对 “from...import *”起作用,单独导入未归入内置变量的模块是可以执行的

Python学习笔记(十):包、模块、类、函数/变量

4.4 可以在包的__init__中批量导入库、模块,将需要引入这些库、模块的.py中添加一行导入这个包的代码,就可以了

示例,p4下新建一个c4.py,c2与c4都需要导入相同的库,可以将这些库添加在__init__.py中

Python学习笔记(十):包、模块、类、函数/变量

c4.py中可以不重复导入,直接打印sys的信息

Python学习笔记(十):包、模块、类、函数/变量

注:1.包和模块不会重复导入

      2.要避免循环导入,如c1与c3互相导入,形成了一个循环,运行c2.py,会报错

Python学习笔记(十):包、模块、类、函数/变量

五、内置变量

注:模块中除了人为定义的一些变量外,还有一些其它变量是已经被定义好的

c3.py中打印dir()信息,dir()可以输出所有的变量信息

Python学习笔记(十):包、模块、类、函数/变量

打印出的带有双下划线的变量是系统定义好的内置变量

5.1__name__:模块的命名空间+模块名

    注:当__name__的值为__main__时,此文件为入口文件

     可以在模块中加入以下代码,代表当前文件为入口文件执行时,可以运行的代码

        if __name__ == '__main__'

                pass

5.2__package__:模块的包名

    注:入口文件不属于任何包,所以入口文件的__package__没有值,为nonetype

5.3__doc__:模块中的注释

5.4__file__:模块的物理路径,即在电脑中的存储路径

     注:__file__的值与执行全集python的路径有关

六、相对导入和绝对导入

6.1 *包:可执行文件所在的包,是其引入的其它模块的*包

6.2 绝对路径:从*包开始往下查找

      如:Python学习笔记(十):包、模块、类、函数/变量

6.3 相对路径:单独使用import不能使用相对路径,只能用于“from... import 模块”的格式

        “.”:表示当前目录

        “..”:表示上一级目录

        “...”:表示上上级目录

        依次类推

        注:1.执行文件不能使用相对路径,因为相对路径能找到模块是根据内置变量__name__去定位,而执行文件的__name__值会变为__main__,此时无法定位

              2.相对路径不能导入与*包同级或超出*包的模块,若要执行,则需要在执行文件的上一级包执行