zoukankan      html  css  js  c++  java
  • Python学习笔记(17)-模块、包

    模块

    Python中一个.py文件就是一个模块,我们可以通过引入模块来使用模块中的功能

    import

    引入模块的方法:import  模块名

    使用模块中功能的方法:模块名.功能(功能指类或者函数等)

    示例:

    import test_msg
    test_msg.test()

    运行结果:

    ---test---

    注意:

    1、test_msg.py中代码

    def test():
        print("---test---")

    2、import 模块名时不要带.py后缀,如错误示例 import test_msg.py

    3、模块分三种:系统自带的模块如random,下载安装的第三方模块如pygame,自己写的自定义模块如上面的test_msg,其中要想引入自定义的模块test_msg,执行import test_msg代码的位置要与模块处于同一层目录下

    from   import

    如果想直接引入模块中的某一部分功能,引入的方法为from 模块名 import 功能1,功能2.....等

    示例:

    from test_msg import test1,test2
    test1()
    test2()

    运行结果:

    ---test1---
    ---test2---

    说明:

    1、test_msg.py中代码

    def test1():
        print("---test1---")
    def test2():
        print("---test2---")

    2、由于直接引入了功能,所以执行时不再是test_msg.test1()而直接是test1()

    3、同样执行代码的位置要与模块处于同一层目录下

    from  import *

    如果一个模块中的功能非常多,通过写功能名的方式导入有些繁琐,还有种导入模块中功能的方法为from 模块名 import *,*号代表所有功能

    示例:

    from test_msg import *
    test1()
    test2()

    运行结果:

    ---test1---
    ---test2---

    注意:

    这种导入方式不适合多个模块中有功能名称相同的情况,如两个模块中都有函数名test(),当使用功能时只会使用最后调用的那个

    __all__

    当以from 模块名 import *方式导入模块功能时,可通过在模块中添加__all__变量来指定允许导入哪些功能

    示例:

    test_msg.py中代码

    __all__ = ["test1","test2"]
    def test1():
        print("---test1---")
    def test2():
        print("---test2---")
    def test3():
        print("---test3---")

    执行代码

    from test_msg import *
    test1()
    test2()
    test3()

    运行结果:

    Traceback (most recent call last):
      File "F:/untitled/Python_jichu/模块/main.py", line 4, in <module>
        test3()
    ---test1---
    ---test2---
    NameError: name 'test3' is not defined

    注意:

    1、__all__前后为两个下划线

    2、__all__类型为列表,每个元素是导入模块中的功能名字的字符串

    3、未写入__all__列表中的功能不会被引入

    as

    如果一个模块名字过长,我们可以通过as将模块重新命名

    命名方法:import 模块名 as 自定义模块名

    示例:

    import test_msg as abc
    abc.test1()
    abc.test2()
    abc.test3()

    运行结果:

    ---test1---
    ---test2---
    ---test3---

    模块的搜索顺序

    当我们导入一个模块时,Python会先从当前路径下搜索,如果当前路径下不存在则搜索系统模块所在路径,系统模块路径可通过打印os.__file__查看,前提是要导入os模块(import os)

    __name__==__main__

    一个模块被引入的时候会将模块中的代码从头到尾执行一遍

    示例:

    test_msg中代码

    def test1():
        print("---test1---")
    def test2():
        print("---test2---")
    def test3():
        print("---test3---")
    test1()
    test2()
    test3()

    执行代码

    import test_msg
    test_msg.test1()
    test_msg.test2()
    test_msg.test3()

    运行结果:

    ---test1---
    ---test2---
    ---test3---
    ---test1---
    ---test2---
    ---test3---

    很显然调用者只想看到一遍输出结果,但由于引入模块时已经执行了一遍模块中的代码,最终结果显示了两遍,但是编写test_msg模块的人又需要测试代码是否可以正常运行,那么显然将模块中的调用方法删除不是好的处理方式

    模块中存在一个变量__name__,如打印这个变量在模块自身执行时输出"__main__",在调用者处执行时输出模块名即"send_msg",那么在模块中只要编写if __name__=="__main__"时才调用方法,那么通过引入模块方式调用功能时则不会执行

    示例:

    test_msg中代码

    def test1():
        print("---test1---")
    def test2():
        print("---test2---")
    def test3():
        print("---test3---")
    if __name__=="__main__":
        test1()
        test2()
        test3()

    执行代码

    import test_msg
    test_msg.test1()
    test_msg.test2()
    test_msg.test3()

    运行结果

    ---test1---
    ---test2---
    ---test3---

    注意:

    __main__是字符串

     包

    多个模块放在一个文件夹中,且文件夹中含有__init__.py文件,这个文件夹称作包

    __init__中__all__

    想要以from方式从包中引入模块,需要在__init__文件中写入需要引入模块的名字,方式为__all__ = [模块名1,模块名2等]

    示例:

  • 相关阅读:
    链表的相关算法及应用(二)
    Hexo博客同时托管到github和coding
    Valine评论出现Code 403:访问被API域名白名单拒绝,请检查你的安全域名设置
    记一次Python爬虫入门
    基于SSM的个人博客
    JSTL和EL表达式遍历List数组
    bootstrap快速开发响应式页面
    标签随机文字颜色和字体大小的实现方法
    安卓Service和Broadcast实现简单的音乐播放器
    ListView设置OnItemClickListener点击没有反应
  • 原文地址:https://www.cnblogs.com/lidongaistudy/p/9598389.html
Copyright © 2011-2022 走看看