专栏首页python学习笔记Python创建包,导入包

Python创建包,导入包

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

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

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

  1. 创建一个文件夹,其名称设置为 my_package;
  2. 在该文件夹中添加一个 __init__.py 文件,此文件中可以不编写任何代码。不过,这里向该文件编写如下代码:'''http://c.biancheng.net/创建第一个 Python 包'''print('http://c.biancheng.net/python/') 可以看到,__init__.py 文件中,包含了 2 部分信息,分别是此包的说明信息和一条 print 输出语句。

由此,我们就成功创建好了一个 Python 包。

创建好包之后,我们就可以向包中添加模块(也可以添加包)。这里给 my_package 包添加 2 个模块,分别是 module1.py、module2.py,各自包含的代码分别如下所示(读者可直接复制下来):

#module1.py模块文件def 
display(arc):    
    print(arc)
#module2.py 模块文件
class CLanguage:    
    def display(self):        
        print("http://c.biancheng.net/python/")

现在,我们就创建好了一个具有如下文件结构的包:

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.module1my_package.module1.display("http://c.biancheng.net/java/")

运行结果为:

http://c.biancheng.net/java/

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

import 
my_package.module1 as modulemodule.display("http://c.biancheng.net/python/")

程序执行结果为:

http://c.biancheng.net/python/

另外,当直接导入指定包时,程序会自动执行该包所对应文件夹下的 __init__.py 文件中的代码。例如:

import 
my_packagemy_package.module1.display("http://c.biancheng.net/linux_tutorial/")

直接导入包名,并不会将包中所有模块全部导入到程序中,它的作用仅仅是导入并执行包下的 __init__.py 文件,因此,运行该程序,在执行 __init__.py 文件中代码的同时,还会抛出 AttributeError 异常(访问的对象不存在):

http://c.biancheng.net/python/ Traceback (most recent call last):   File "C:\Users\mengma\Desktop\demo.py", line 2, in <module>     my_package.module1.display("http://c.biancheng.net/linux_tutorial/") AttributeError: module 'my_package' has no attribute 'module1'

我们知道,包的本质就是模块,导入模块时,当前程序中会包含一个和模块名同名且类型为 module 的变量,导入包也是如此:

import my_packageprint(my_package)
print(my_package.__doc__)
print(type(my_package))

运行结果为:

http://c.biancheng.net/python/ <module 'my_package' from 'C:\\Users\\mengma\\Desktop\\my_package\\__init__.py'> http://c.biancheng.net/ 创建第一个 Python 包 <class 'module'>

2) from 包名 import 模块名 [as 别名]

仍以导入 my_package 包中的 module1 模块为例,使用此语法格式的实现代码如下:

from my_package import module1
module1.display("http://c.biancheng.net/golang/")

运行结果为:

http://c.biancheng.net/python/ http://c.biancheng.net/golang/

可以看到,使用此语法格式导入包中模块后,在使用其成员时不需要带包名前缀,但需要带模块名前缀。

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

from my_package import module1 as module
module.display("http://c.biancheng.net/golang/")

此程序的输出结果和上面程序完全相同。

同样,既然包也是模块,那么这种语法格式自然也支持from 包名 import *这种写法,它和 import 包名 的作用一样,都只是将该包的 __init__.py 文件导入并执行。

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

此语法格式用于向程序中导入“包.模块”中的指定成员(变量、函数或类)。通过该方式导入的变量(函数、类),在使用时可以直接使用变量名(函数名、类名)调用,例如:

from my_package.module1 import display
display("http://c.biancheng.net/shell/")

运行结果为:

http://c.biancheng.net/python/ http://c.biancheng.net/shell/

当然,也可以使用 as 为导入的成员起一个别名,例如:

from my_package.module1 import display as dis
dis("http://c.biancheng.net/shell/")

该程序的运行结果和上面相同。

另外,在使用此种语法格式加载指定包的指定模块时,可以使用 * 代替成员名,表示加载该模块下的所有成员。例如:

from my_package.module1 import *
display("http://c.biancheng.net/python")

原文链接:http://c.biancheng.net/view/4669.html

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python __file__属性:查看模块的源文件路径

    前面章节提到,当指定模块(或包)没有说明文档时,仅通过 help() 函数或者 __doc__ 属性,无法有效帮助我们理解该模块(包)的具体功能。在这种情况下,...

    风之随想
  • Python __init__.py 作用详解

    __init__.py 文件的作用是将文件夹变为一个Python模块,Python 中的每个模块的包中,都有__init__.py 文件。

    风之随想
  • python之XML文件解析

    常见的XML编程接口有DOM和SAX,这两种接口处理XML文件的方式不同,当然使用场合也不同。

    风之随想
  • 带你领略 html2canvas

    如果你希望排除某些元素被渲染,你可以添加data-html2canvas-ignore属性到这些元素,html2canvas将从渲染中排除它们。

    公众号---人生代码
  • 深度学习中的过拟合问题

      欠拟合:根本原因是特征维度过少,模型过于简单,导致拟合的函数无法满足训练集,误差较大。

    小锋学长
  • Python——中缀到后缀的转换(Sta

    3、当token==“(”时,opstack中存入“(”,因为转换成后缀就不需要用“()”表示优先级,存起来是用于做优先级的判断

    py3study
  • 将Java EE应用程序部署到Docker Swarm集群

    Docker Swarm 为Docker提供本地集群。 Docker Swarm 0.2.0版本的集群 提供了Docker Swarm 的基本介绍,以及如何创...

    Techeek
  • Python与DBA

     传统上,当需要为操作系统编写一些脚本时,人们常常会选用 Bash 或 Perl 脚本工具。这些工具易于使用,因而它们几乎变得无处不在,***到了包括 Orac...

    py3study
  • Robot Framework(15)- 扩展关键字

    https://www.cnblogs.com/poloyy/category/1770899.html

    小菠萝测试笔记
  • 如何在Linux中从可启动USB驱动器创建ISO?

    我们都知道如何从ISO创建可引导的USB驱动器。我们可以使用dd命令、Etcher、Popsicle、Bootiso、MultiCD和Mkusb创建可启动的US...

    用户6543014

扫码关注云+社区

领取腾讯云代金券

,,