Python创建包,导入包(入门必读)

1年前 (2024-04-26)

《Python包》一节中已经提到,包其实就是文件夹,更确切的说,是一个包含“__init__.py”文件的文件夹。因此,如果我们想手动创建一个包,只需进行以下 2 步操作:

  1. 新建一个文件夹,文件夹的名称就是新建包的包名;

  2. 在该文件夹中,创建一个 __init__.py 文件(前后各有 2 个下划线‘_’),该文件中可以不编写任何代码。当然,也可以编写一些 Python 初始化代码,则当有其它程序文件导入包时,会自动执行该文件中的代码(本节后续会有实例)。


例如,现在我们创建一个非常简单的包,该包的名称为 my_package,可以仿照以上 2 步进行:

  1. 创建一个文件夹,其名称设置为 my_package;

  2. 在该文件夹中添加一个 __init__.py 文件,此文件中可以不编写任何代码。不过,这里向该文件编写如下代码:

    '''

    http://c.biancheng网站站点" rel="nofollow" />

    #module1.py模块文件

    def display(arc):

    print(arc)

    #module2.py 模块文件

    class CLanguage:

    def display(self):

    print("http://c.biancheng网站站点" rel="nofollow" /> my_package
         ┠── __init__.py
         ┠── module1.py

         ┗━━  module2.py

    当然,包中还有容纳其它的包,不过这里不再演示,有兴趣的读者可以自行调整包的结构。

    Python包的导入

    通过前面的学习我们知道,包其实本质上还是模块,因此导入模块的语法同样也适用于导入包。无论导入我们自定义的包,还是导入从他处下载的第三方包,导入方法可归结为以下 3 种:

    1. import 包名[.模块名 [as 别名]]
    2. from 包名 import 模块名 [as 别名]
    3. from 包名.模块名 import 成员名 [as 别名]

    用 [] 括起来的部分,是可选部分,即可以使用,也可以直接忽略。

    注意,导入包的同时,会在包目录下生成一个含有 __init__.cpython-36.pyc 文件的 __pycache__ 文件夹。

    1) import 包名[.模块名 [as 别名]]

    以前面创建好的 my_package 包为例,导入 module1 模块并使用该模块中成员可以使用如下代码:

    import my_package.module1

    my_package.module1.display("http://c.biancheng网站站点" rel="nofollow" />

    http://c.biancheng网站站点" rel="nofollow" /> 通过此语法格式导入包中的指定模块后,在使用该模块中的成员(变量、函数、类)时,需添加“包名.模块名”为前缀。当然,如果使用 as 给包名.模块名”起一个别名的话,就使用直接使用这个别名作为前缀使用该模块中的方法了,例如:

    import my_package.module1 as module

    module.display("http://c.biancheng网站站点" rel="nofollow" />

    http://c.biancheng网站站点" rel="nofollow" />

    import my_package

    my_package.module1.display("http://c.biancheng网站站点" rel="nofollow" /> http://c.biancheng网站站点" rel="nofollow" />

    import my_package

    print(my_package)

    print(my_package.__doc__)

    print(type(my_package))

    运行结果为:

    http://c.biancheng网站站点" rel="nofollow" />

    from my_package import module1

    module1.display("http://c.biancheng网站站点" rel="nofollow" /> http://c.biancheng网站站点" rel="nofollow" /> 使用此语法格式导入包中模块后,在使用其成员时不需要带包名前缀,但需要带模块名前缀。

    当然,我们也可以使用 as 为导入的指定模块定义别名,例如:

    from my_package import module1 as module

    module.display("http://c.biancheng网站站点" rel="nofollow" /> 通过该方式导入的变量(函数、类),在使用时可以直接使用变量名(函数名、类名)调用,例如:

    from my_package.module1 import display

    display("http://c.biancheng网站站点" rel="nofollow" /> http://c.biancheng网站站点" rel="nofollow" />

    from my_package.module1 import display as dis

    dis("http://c.biancheng网站站点" rel="nofollow" />

    from my_package.module1 import *

    display("http://c.biancheng网站站点" rel="nofollow" />