• python基础8之自定义模块、if __name__==__main__:解释


    一、自定义模块与使用

    python模块说明:类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),多个 .py 文件组成的代码集合就称为模块。

    模块分三种:

    • 内置模块
    • 第三方模块
    • 自定义模块

    开始自定义模块:

    1.创建模块

    自定义模块可以是单个以.py结尾的文件,也是可以多个,当有多个.py文件组成一个模块时我们需要以.用到__init__.py文件来初始化它。

    demo:

    新建一个命名my_name.py(注意不要和已经有的模块同名)的文件,如图:

     

    代码块:

    #/usr/bin/env python
    # -*- coding:utf-8 -*-
    #Author:W-D
    import sys
    def name():
        print("my name is wd")
    code

    2.导入模块

    导入模块大致有以下几种方式:

    import module
    import module.xx.xx
    from module.xx.xx import xx
    from module.xx.xx import xx as rename 
    from module.xx.xx import *

    导入模块其实就是告诉Python解释器去解释那个py文件

    • 导入一个py文件,解释器解释该py文件
    • 导入一个包,解释器解释该包下的 __init__.py 文件

    demo:

    #/usr/bin/env python
    # -*- coding:utf-8 -*-
    #Author:W-D
    import my_name
    my_name.name()
    结果:
    my name is wd

    3.以上的demo都是在同一目录并且在"./"目录下,我们知道python找模块是通过path变量进行搜索,所以我们也可以将自己定义的模块直接放到python的path变量中,这样就可以直接导入了。

    path路径获取方式:

    #/usr/bin/env python
    # -*- coding:utf-8 -*-
    #Author:W-D
    import sys
    print(sys.path)
    结果:
    C:Python35python3.exe F:/pyproject/mode2/test.py
    ['F:\pyproject\mode2', 'F:\pyproject', 'C:\Python35\python35.zip', 'C:\Python35\DLLs', 'C:\Python35\lib', 'C:\Python35', 'C:\Python35\lib\site-packages']

    4.不同目录间进行模块调用。

    场景:当我们开发了一个模块,要导入使用时候,发现目录根本不在path变量里面,无法导入,此时我们就需要动态的将当前文件的目录加载到path里面,sys.path是一个list,我们通过append方法追加进去。

    demo:

    import sys
    import os
    project_path=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    sys.path.append(project_path)
    二、关于if __name__==__main__的解释

    在解释之前首先我们看下__name__这个变量存的是什么:

    #!/usr/bin/env python
    # -*- coding:utf-8 -*- 
    # Author:W-D
    print(__name__)
    结果:
    __main__

    结果分析:当我们运行的程序的时候,__name__这个内置变量值就是__main__。

    下面我们来看下导入模块时候__name__变量值:

    test.py代码:

    #!/usr/bin/env python
    # -*- coding:utf-8 -*- 
    # Author:W-D
    
    print("this is before if __name__:%s"%__name__)
    if __name__=='__main__':
        print("this is after if __name__:%s"%__name__)

    导入test模块并执行

    #/usr/bin/env python
    # -*- coding:utf-8 -*-
    #Author:W-D
    import test
    结果:
    this is before if __name__:test

    可以看到,此时变量__name__值为模块名,并没有执行if中的语句,结果只有一条。

    综上分析:

    if __name__=='__main__'说白了就是判断__name__变量是不是等于__main__,当执行文件本身时候__name__变量等于main,此时判断成立并执行判断语句中的代码,当调用该模块的时候__name__并不等于__main__条件不成立,不执行判断下面的语句,可以认为为了调试模块,因为在模块导入的时候并不执行if下面的语句。

  • 相关阅读:
    Ubuntu16.04更新记
    「BZOJ2153」设计铁路
    [UVA-11995]I Can Guess the Data Structure!
    [UVA-11100] The Trip
    [UVA-11039]Children's Game
    [BZOJ1008][HNOI2008]越狱
    NOIP2018退役祭
    修马路
    [NOIP2005]过河
    [POJ1958][Strange Tower of Hanoi]
  • 原文地址:https://www.cnblogs.com/wdliu/p/6507668.html
Copyright © 2020-2023  润新知