Python创建包
<<Python包>>一节中已经提到,包其实就是文件夹,更确切的说,是一个包含“__init__.py”文件的文件夹。因此,如果我们想手动创建一个包,只需进行以下 2 步操作:
1、新建一个文件夹,文件夹的名称就是新建包的包名;
2、在该文件夹中,创建一个 __init__.py 文件(前后各有 2 个下划线 _),该文件中可以不编写任何代码。当然,也可以编写一些 Python 初始化代码,则当有其它程序文件导入包时,会自动执行该文件中的代码(本节后续会有实例)。
例如,现在我们创建一个非常简单的包,该包的名称为 my_package,可以仿照以上 2 步进行:
1、创建一个文件夹,其名称设置为 my_package;
2、在该文件夹中添加一个 __init__.py 文件,此文件中可以不编写任何代码。不过,这里向该文件编写如下代码:
#!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'tian' __data__ = '2024/2/5 11:28' # software: PyCharm ''' https://www.cnblogs.com/qingchengzi 创建第一个 Python 包 ''' print('my-package包里面的__init__py')
可以看到,__init__.py 文件中,包含了 2 部分信息,分别是此包的说明信息和一条 print 输出语句。
由此,我们就成功创建好了一个Python包。
创建好包之后,我们就可以向包中添加模块(也可以添加包)。这里给 my_package 包添加 2 个模块,分别是 module1.py、module2.py,各自包含的代码分别如下所示(读者可直接复制下来):
module1.py
#!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'tian' __data__ = '2024/2/5 11:28' # software: PyCharm def display(arc): print(arc)
module2.py
#module2.py 模块文件 class PLanguage: def display(self): print("https://www.cnblogs.com/qingchengzi")
现在,我们就创建好了一个具有如下文件结构的包:
my_package ┠── __init__.py ┠── module1.py ┗━━ module2.py
当然,包中还有容纳其它的包,不过这里不再演示,有兴趣的读者可以自行调整包的结构。
Python包的导入
通过前面的学习我们知道,包其实本质上还是模块,因此导入模块的语法同样也适用于导入包。无论导入我们自定义的包,还是导入从他处下载的第三方包,导入方法可归结为以下 3 种:
import 包名[.模块名 [as 别名]] from 包名 import 模块名 [as 别名] from 包名.模块名 import 成员名 [as 别名]
用 [] 括起来的部分,是可选部分,即可以使用,也可以直接忽略。
注意,导入包的同时,会在包目录下生成一个含有 __init__.cpython-36.pyc 文件的 __pycache__ 文件夹。
1) import 包名[.模块名 [as 别名]]
以前面创建好的 my_package 包为例,导入 module1 模块并使用该模块中成员可以使用如下代码:
from my_package.module1 import display display("https://www.cnblogs.com/qingchengzi/p/18054793")
运行结果:
my-package包里面的__init__py
https://www.cnblogs.com/qingchengzi/p/18054793
可以看到,通过此语法格式导入包中的指定模块后,在使用该模块中的成员(变量、函数、类)时,需添加"包名.模块名"为前缀。当然,如果使用 as 给包名.模块名”起一个别名的话,就使用直接使用这个别名作为前缀使用该模块中的方法了,例如:
import my_package.module1 as module
module.display("https://www.cnblogs.com/qingchengzi/p/18054793")
运行结果:
my-package包里面的__init__py
https://www.cnblogs.com/qingchengzi/p/18054793
另外,当直接导入指定包时,程序会自动执行该包所对应文件夹下的 __init__.py 文件中的代码。例如:
import my_package 直接导入包名,并不会将包中所有模块全部导入到程序中,它的作用仅仅是导入并执行包下的 __init__.py 文件,因此,运行该程序,执行 __init__.py 文件中代码;
运行结果:
my-package包里面的__init__py
我们知道,包的本质就是模块,导入模块时,当前程序中会包含一个和模块名同名且类型为 module 的变量,导入包也是如此:
import my_package
print(my_package)print(type(my_package))
运行结果:
my-package包里面的__init__py <module 'my_package' from 'E:\\workbook\\Python平时练习学习目录\\my_package\\__init__.py'><class 'module'>
2) from 包名 import 模块名 [as 别名]
仍以导入 my_package 包中的 module1 模块为例,使用此语法格式的实现代码如下:
from my_package import module1 module1.display("https://www.cnblogs.com/qingchengzi/p/18055134")
运行结果:
my-package包里面的__init__py
https://www.cnblogs.com/qingchengzi/p/18055134
3) from 包名.模块名 import 成员名 [as 别名]
此语法格式用于向程序中导入“包.模块”中的指定成员(变量、函数或类)。通过该方式导入的变量(函数、类),在使用时可以直接使用变量名(函数名、类名)调用,例如:
#!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'tian' __data__ = '2024/11/27 8:56' # software: PyCharm from my_package.module1 import display display("https://www.cnblogs.com/qingchengzi/p/18055134")
运行结果:
my-package包里面的__init__py
https://www.cnblogs.com/qingchengzi/p/18055134
浙公网安备 33010602011771号