zoukankan      html  css  js  c++  java
  • python3导入自定义模块

    1、模块概念

    在Python中,一个.py文件就称之为一个模块(Module)。使用模块组织代码,最大的好处是大大提高了代码的可维护性

    模块一共三种:python标准库、第三方模块、应用程序自定义模块。

    相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。

    使用模块的好处:最大的好处是大大提高了代码的可维护性。其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。

    2、模块导入

    import语句

    1 import module1[, module2[,... moduleN]

    import一个模块的实质就是把这个python文件从头到尾执行一遍

    import模块的查找模块的顺序如下:
    1、先从当前目录下找
    2、当前目录下找不到的话,在从sys.path的路径找
    从上面两个目录都找不到,那就报错(当然,可以使用sys.path.append()把一个临时目录加进去,那么也可以查到到路径,但是第二次的时候就不能用了)

    每次import的时候,都会相应的开辟内存空间存放被import的内容,但是与调用import的文件开辟的内存空间相互独立。例如import foo.py在新建的名称空间里执行源文件(foo.py)代码时,所有对全局名称空间的引用或修改,都是以foo.py为准。

    注意:

    一个模块可以在当前位置import多次,但是只有第一次导入会执行内容,其他的都为引用内存

    更改调用名称:将logging更改为log

    1 import logging as log
    2 log.critical("www")

    from...import语句

    1 from modname import name1[, name2[, ... nameN]]

    这个声明不会把整个modulename模块导入到当前的命名空间中,只会将它里面的name1或name2单个引入到执行这个声明的模块的全局符号表。

    例如:有moudel_name.py

    # -*- coding:utf-8 -*-
    print("This is module_name.py")
    
    name = 'Hello'
    
    def hello():
        print("Hello")

    module_test04.py

    # -*- coding:utf-8 -*-
    import module_name 
    
    def a():
        module_name.hello()
        print("fun a")
    
    def b():
        module_name.hello()
        print("fun b")
    
    a()
    b()

    多个函数需要重复调用同一个模块的同一个方法,每次调用需要重复查找模块。所以可以做以下优化:

    module_test05.py

    # -*- coding:utf-8 -*-
    from module_name import hello 
    
    def a():
        hello()
        print("fun a")
    
    def b():
        hello()
        print("fun b")
    
    a()
    b()

    运行结果都是

    运行结果:
    E:PythonImport>python module_test04.py
    This is module_name.py
    Hello
    fun a
    Hello
    fun b

    可以使用"from module_name import hello"进行优化,减少了查找的过程。

    包的调用

    为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。

    每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录(文件夹),而不是一个包。__init__.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块,而它的模块名就是对应包的名字。调用包就是执行包下的__init__.py文件。

    跨包调用(当前目录下有modulepack1包):

    1 from modulepack1[.modulepack2] import module

    如果当前目录下能够找到要调用的包,可以直接from包import模块,如果当前目录找不到要调用的包,需要向sys.path添加包的所在绝对路径。

    import一个包名,就等于执行了这个包下的__init__文件。

    示例:

    在nod1里import  hello是找不到的,需要手动添加包路径,如果找到那是因为pycharm给加了不必要的路径,以命令行执行为准。

    import sys,os
    BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  #__file__获取执行文件相对路径,整行为取上一级的上一级目录
    sys.path.append(BASE_DIR)  #添加路径,这个是临时的
    import hello
    hello.hello1()

    将包设置为程序代码的根目录

    模块调用测试

    1 if __name__=='__main__':  #__name__方法判断
    2     print('ok')

    在一个py模块直接执行print(__name__)会输出__main__,表示当前这个文件属于执行文件,如果从其他的py模块中导入一个py模块,执行被导入的py模块中的print(__name__)会输出被导入的模块的模块名称,那么if判断就不会成功,所以导入的时候不会执行判断内的代码。

    主要用在调试功能,即一个模块被调用的时候不执行内容,而自己调试模块的时候可以顺利的执行模块内容。

    内建函数

    可以通过 "print(dir(__builtins__))" 查看Python中的内建函数

    非内建函数需要使用"import"导入。Python中的模块文件在"安装路径PythonPython35Lib"目录下。

  • 相关阅读:
    线程
    ACM/OJ输入输出Tips
    Maven---pom.xml详解
    通过chrome分析知乎的登录过程学习cookie原理
    Javaweb日志系统
    SpingMVC+AJAX+jquery表单数据交互
    SpringMVC Controller 失效 404错误 IEDA
    【JavaSE】Properties类
    freemaker判断对象非空
    移植openssh时could not load host key: /etc/ssh/ssh_host_rsa_key 无法启动ssh的一个解决办法
  • 原文地址:https://www.cnblogs.com/blueteer/p/10136225.html
Copyright © 2011-2022 走看看