• Python中包(package)的调用方式


     一.什么是Python Package

      如何区分你看到的目录是一个Python Package包呢?其实很简单,你只要看这个名录下是否有“__init__.py”这个文件就好了,如果有那么就是Python Package包,如果没有,就说嘛你看到的就是个普通的目录,如下图,你就可以看出来"calcuate"和"Log"就是一个Python Package包,而"yinzhengjie"就是一个目录,而判断的依据就是是否包含_init__.py文件。"yinzhengjie"这个目录下包含三个文件,即“calcuate”,“Log”和“bin.py"文件。

    二.主程序调用包中的模块

      目录结构如上图所示,以下是其中各个文件中的代码。

    sc_cal
    复制代码
     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 #@author :yinzhengjie
     4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
     5 #EMAIL:y1053419035@qq.com
     6 
     7 import logging as log
     8 
     9 def GetLogger():
    10     logger = log.getLogger()
    11 
    12     fh = log.FileHandler("log.txt")
    13 
    14     logger.addHandler(fh)
    15 
    16     return logger
    复制代码

      以下是bin主程序的代码。

    复制代码
     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 #@author :yinzhengjie
     4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
     5 #EMAIL:y1053419035@qq.com
     6 
     7 from Log import logger
     8 
     9 from  calcuate import sc_cal
    10 
    11 obj = logger.GetLogger()
    12 
    13 obj.error("This yinzhengjie's test error !")
    14 
    15 s1 = sc_cal.Add(100,200)
    16 
    17 print(s1)
    18 
    19 
    20 
    21 #以上代码执行结果如下:
    22  300
    复制代码

      执行主程序代码之后,会在执行的目录中生成一个名称为“log.txt”的文件。

    1 This yinzhengjie's test error !

    三.包中模块的调用

      目录结构如上图所示,以下是其中各个文件中的代码。

    sc_cal
    dome
    logger

      以下是bin主程序的代码。

    复制代码
     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 #@author :yinzhengjie
     4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
     5 #EMAIL:y1053419035@qq.com
     6 
     7 from Log import logger
     8 
     9 from  calcuate import sc_cal
    10 
    11 obj = logger.GetLogger()
    12 
    13 obj.error("This yinzhengjie's test error !")
    14 
    15 s1 = sc_cal.Add(100,200)
    16 
    17 print(s1)
    18 
    19 
    20 
    21 
    22 #以上代码执行结果如下:
    23 30
    24 300
    复制代码
    log.txt

    四.同级目录下的被调用模块之间的相互调用

     

      目录结构如上图所示,以下是其中各个文件中的代码。

    1>.Log 包中的源代码

    dome
    logger

    2>.calcuate 包中的源代码

    sc_cal

    3>.bin 包中的源代码

    复制代码
     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 #@author :yinzhengjie
     4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
     5 #EMAIL:y1053419035@qq.com
     6 
     7 import os,sys
     8 
     9 
    10 AbsolutePath = os.path.abspath(__file__)           #将相对路径转换成绝对路径
    11 
    12 SuperiorCatalogue = os.path.dirname(AbsolutePath)   #相对路径的上级路径
    13 
    14 BaseDir = os.path.dirname(SuperiorCatalogue)        #在“SuperiorCatalogue”的基础上在脱掉一层路径,得到我们想要的路径。
    15 
    16 sys.path.insert(0,BaseDir)                          #将我们取出来的路径加入到Python的命名空间去,并将该目录插入在第一个位置中。
    17 
    18 from Log import logger
    19 
    20 from  calcuate import sc_cal
    21 
    22 
    23 obj = logger.GetLogger()
    24 
    25 obj.error("This yinzhengjie's test error !")
    26 
    27 s1 = sc_cal.Add(100,200)
    28 
    29 print(s1)
    30 
    31 
    32 
    33 #以上代码执行结果如下:
    34 30
    35 300
    复制代码

      执行主程序代码之后,会在执行的目录中生成一个名称为“log.txt”的文件。

    log.txt

    五.包的多级调用

      目录结构如上图所示,以下是其中各个文件中的代码。

    复制代码
     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 #@author :yinzhengjie
     4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
     5 #EMAIL:y1053419035@qq.com
     6 
     7 import logging as log
     8 
     9 
    10 def GetLogger():
    11     logger = log.getLogger()
    12 
    13     fh = log.FileHandler("log.txt")
    14 
    15     logger.addHandler(fh)
    16 
    17     return logger
    复制代码

      主程序代码如下:

    复制代码
     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 #@author :yinzhengjie
     4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
     5 #EMAIL:y1053419035@qq.com
     6 
     7 
     8 from Log.Loger import logger as log
     9 
    10 obj = log.GetLogger()
    11 
    12 obj.error("This yinzhengjie's test error !")
    复制代码

      执行主程序代码之后,会在执行的目录中生成一个名称为“log.txt”的文件。

    log.txt

    六.__name__的应用

    复制代码
     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 #@author :yinzhengjie
     4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
     5 #EMAIL:y1053419035@qq.com
     6 
     7 print("This is Test Page !")
     8 
     9 def foo():
    10     print("ok")
    11 
    12 
    13 
    14 if __name__=="__main__":  # 推荐使用这种方式调试代码,只有执行当前模块的人才会执行以下代码,如果是别人调用该模块,以下的代码是不会被执行的!
    15     foo()
    16 
    17 print(__name__)
    18 
    19 
    20 
    21 
    22 
    23 
    24 #以上代码执行结果如下:
    25 This is Test Page !
    26 ok
    27 __main__
    复制代码
    复制代码
     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 #@author :yinzhengjie
     4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
     5 #EMAIL:y1053419035@qq.com
     6 
     7 
     8 import name
     9 
    10 
    11 
    12 #以上代码执行结果如下:
    13 This is Test Page !
    14 name
    复制代码
  • 相关阅读:
    【JZOJ3213】【SDOI2013】直径
    【JZOJ3211】【SDOI2013】随机数生成器
    【巨人的步伐以及人类的进击】BSGS algorithm
    【JZOJ2758】【SDOI2012】走迷宫(labyrinth)
    【JZOJ4964】【GDKOI2017模拟1.21】Rhyme
    【JZOJ3875】【NOIP2014八校联考第4场第2试10.20】星球联盟(alliance)
    【JZOJ3873】【NOIP2014八校联考第4场第2试10.20】乐曲创作(music)
    【JZOJ3887】【长郡NOIP2014模拟10.22】字符串查询
    【JZOJ3886】【长郡NOIP2014模拟10.22】道路维护
    django 模版-标签-视图-csrf-token-模版继承-HTML过滤器
  • 原文地址:https://www.cnblogs.com/littlehb/p/9451940.html
Copyright © 2020-2023  润新知