zoukankan      html  css  js  c++  java
  • 模块与包之间的调用

    一. 模块

    定义: 如果你从 Python 解释器退出再进入,那么你定义的所有的方法和变量就都消失了。为此 Python 提供了一个办法,把这些定义存放在文件中,为一些脚本或者交互式的解释器实例使用,这个文件被称为模块。

    模块可以分为自定义模块、内置模块和第三方模块

    1.内置模块

    2.第三方模块

    3.自定义模块

    什么叫自定义模块? 自定义模块就是你自己编写的模块 ,在Python中,其后缀名是.py 就是一个模块

    • 例如: 在Pycharm里建个py文件module,写入代码:

      def say_hi():    
      print('name')     
      say_hi() #这样就创建了一个模块.可以添加多个函数,跟正常的python文件一样

    二. 包: 用来从逻辑上组织模块。本质就是一个目录(必须带有一个int.py文件)

    为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为(Package),包名通常为全部小写,避免使用下划线.包是模块的集合,比模块又高一级的封装。没有比包更高级别的封装,但是包可以嵌套包,就像文件目录一样.

    最顶层的Django包封装了contrib子包,contrib包又封装了auth等子包,auth又有自己的子包和一系列模块。通过包的层层嵌套,我们能够划分出一个又一个的命名空间。

    三. 模块与包之间的互相导入

       在我们的程序中,使用其它的模块(包、类、函数),就必须先导入对应的模块(包、类、函数)。在Python中,模块(包、类、函数)的导入方式有:
    

    1.在绝对路径下,导入自定义的模块.绝对路径指在一个包文件下的.py互相导入

    路径说明:core为包文件,Module_a,Main.py为core的俩个py文件

    方式一 :import  模块名

    比如,被导入的模块Module_a:

    # Module_a.py
    def func():
        print("this is module A!") 
    

    在Main.py中导入Module_a:

    # Main.py
    import module_a   #import  模块名
    module_a.func()  # 调用方法  模块名.函数名() #注意中间有个点	
    

    方式二:from 模块名  import 函数名

    在Main.py中导入Module_a:

    # Main.py
    from module_a import func
    module_a.func()   # 错误的调用方式
    func()  # 这时需要直接调用func
    

    方式三: form 模块名 import * 将对象内的所有内容全部导入

    A.在Main.py中导入Module_a: 导入单个函数

    from module_a import *
    func()  
    返回:this is module A!
    

    B.如果针对导入的模块内有多个函数.需要导入并使用:

    #module_a.py
    def func():
        print("this is module A!")
    
    def fun123():
        print('this is fun123
    
    在Main.py中导入Module_a: 导入多个函数
    
    from module_a import *
    func()
    fun123()
    返回:
    this is module A!
    this is fun123
    

    C:需要注意的是:在main.py模块内定义的函数名与module_a的名称一样,就会被覆盖,尽量做到不与函数名重复.

    # Main.py
    from module_a import *
    def func():
        print("this is main module!")
    
    func()  # 从module导入的func被main的func覆盖了
    

    2.在相对路径下导入包,包与包之间的相互调用:

    路径说明:在图中 modile11, bin, core 都是包,并且bin和core是modile11的子包 .

    在这种相对路径下导入,子包与子包的相互调用,需要用到os,sys模块将路径添加到环境变量里.

    以图为例子:在子包bin文件下的`run.py`文件要导入core子包的`module_a.py`文件信息. 就要先找到`bin`,`core`的共同父级目录
    添加到环境变量
    import os
    import sys
    DIR =os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    print(DIR)
    sys.path.append(DIR)
    

    比如,被导入的模块Module_a:

    # Module_a.py
    
    def func():
        print("this is module A!") 
    #def fun123():
       # print('this is fun123')
    

    方式一: from 包名 import 模块名

    from core  import module_a
    module_a.func()  #调用方法  模块名.函数名()
    module_a.fun123()  #针对module_a模块内有多个函数也可这样使用
    返回:
    this is module A!
    

    方式二: from 包名. 模块名 import *

    from core.module_a  import *
    func()         #调用方法  函数名()
    #fun123()		#针对module_a模块内有多个函数也可这样使用
    返回:
    this is module A!
    

    需要注意的是:

    在包与包之间的导入,在实际应用中用的比较多,如果被导入的模块函数比较多,也可这样使用.

    四:模块搜索路径

    模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块

    Python根据sys.path的设置,按顺序搜索模块。

    当然,这个设置是可以修改的,就像windows系统环境变量中的path一样,可以自定义。 通过sys.path.append('路径')的方法为sys.path路径列表添加你想要的路径。 如 图中,添加到环境变量的例子.

  • 相关阅读:
    Delphi 与 DirectX 之 DelphiX(60): TDIB.DoTrace();
    Delphi 与 DirectX 之 DelphiX(62): TDIB.DoSolorize();
    Delphi 与 DirectX 之 DelphiX(55): TDIB.DoMosaic();
    利用ImportFromRSS可以方便地收藏其他网站的文章
    粘贴代码更简单的方法(保持VS.NET中的格式)
    请正确填写你的邮件地址
    介绍.Text 中的TrackBack
    在VS.NET中给xsl文件增加智能感知功能
    The Difference Between RegisterStartupScript and RegisterClientScriptBlock
    [转帖]Why you can't catch some exceptions
  • 原文地址:https://www.cnblogs.com/sunny7/p/9921885.html
Copyright © 2011-2022 走看看