Python 包管理

1. 模块

  • 一个模块就是一个包含python代码的文件,后缀名称是.py就可以,模块就是个python文件

  • 为什么我们用模块

    • 程序太大,编写维护非常不方便,需要拆分
    • 模块可以增加代码重复利用的方法
    • 当作命名空间使用,避免命名冲突
  • 如何定义模块

    • 模块就是一个普通文件,所以任何代码可以直接书写
    • 不过根据模块的规范,最好在本块中编写以下内容
      • 函数(单一功能)
      • 类(相似功能的组合,或者类似业务模块)
      • 测试代码
  • 如何使用模块

    • 模块直接导入

      • 模块名称直接以数字开头,需要借助importlib帮助
    • 语法

      import module_name
      module_name.function_name
      module_name.class_name

    • 案例 01.py,02.py,p01.py,p02.py

        # 案例 01.py
        # 包含一个学生类
        # 一个sayHello函数
        # 一个打印语句
    
        class Student():
            def __init__(self, name = "NoName", age = 18):
                self.name = name
                self.age = age
        
            def say(self):
                    print("My name is {0}".format(self.name))
        
        def sayHello():
            print("Hi, ")
        
        print("我是模块p0")
        
    
        # 案例 02.py
        # 借助于importlib包可以实现导入以数字开头的模块名称
        import importlib
        
        # 相当于导入了一个叫01的模块并把导入模块赋值给了a
        
        a = importlib.import_module("01")
        stu = a.Student()
        stu.say()
    
        # 案例 p01.py
        # 包含一个学生类
        # 一个sayHello函数
        # 一个打印语句
        
        class Student():
            def __init__(self, name = "NoName", age = 18):
                self.name = name
                self.age = age
        
            def say(self):
                    print("My name is {0}".format(self.name))
        
        def sayHello():
            print("Hi, ")
        
        # 此判断语句建议一直作为程序的入口
        if __name__ == '__main__':
            print("我是模块p01")
    
        # 案例 p02.py
        import p01
        
        stu = p01.Student("xiaojing", 19)
        
        stu.say()
        
        p01.sayHello()
    
          My name is xiaojing
          Hi, 
    
    • import 模块 as 别名
      • 导入的同时给模块起一个别名
      • 其余用法跟第一种相同
      • 案例 p03.py
        # 案例 p03.py
        import p01 as p
        
        stu = p.Student("yueyue", 18)
        stu.say()
    
          My name is yueyue
    
    • from module_name import func_name, class_name
      • 按上述方法有选择性的导入
      • 使用的时候可以直接使用导入的内容,不需要前缀
      • 案例 p04
        # 案例 p04.py
        from p01 import Student, sayHello
        
        stu = Student()
        
        stu.say()
        
        sayHello()
    
        My name is NoName
        Hi,    
    
    • from module_name import *
      • 导入模块所有内容
      • 案例 p05.py
        # 案例 p05.py
        from p01 import *
        
        sayHello()
        
        stu = Student("yaona", 20)
        stu.say()
    
          Hi, 
          My name is yaona
    
  • if __name__ == ``__main__ 的使用

    • 可以有效的避免模块代码被导入的时候被动执行的问题
    • 建议所有程序的入口都以此代码为入口

2. 模块的搜索路径和存储

  • 什么是模块的搜索路径

    • 加载模块的时候,系统会在哪些地方寻找此模块
  • 系统默认的模块搜索路径

      import sys
      sys.path  属性可以获取路径列表
      # 案例 p06.py
    
        # 案例 p06.py
        import sys
        
        print(type(sys.path))
        print(sys.path)
        
        for p in sys.path:
            print(p)
    
              <class 'list'>
          ['D:\\python\\project\\包管理', 'D:\\PyCharm Community Edition 2019.1.1\\helpers\\pydev', 'D:\\python\\project', 'D:\\PyCharm Community Edition 2019.1.1\\helpers\\third_party\\thriftpy', 'D:\\PyCharm Community Edition 2019.1.1\\helpers\\pydev', 'C:\\Users\\user\\.PyCharmCE2019.1\\system\\cythonExtensions', 'D:\\python\\project\\包管理', 'D:\\Anaconda3\\envs\\opp\\python37.zip', 'D:\\Anaconda3\\envs\\opp\\DLLs', 'D:\\Anaconda3\\envs\\opp\\lib', 'D:\\Anaconda3\\envs\\opp', 'D:\\Anaconda3\\envs\\opp\\lib\\site-packages']
          D:\python\project\包管理
          D:\PyCharm Community Edition 2019.1.1\helpers\pydev
          D:\python\project
          D:\PyCharm Community Edition 2019.1.1\helpers\third_party\thriftpy
          D:\PyCharm Community Edition 2019.1.1\helpers\pydev
          C:\Users\user\.PyCharmCE2019.1\system\cythonExtensions
          D:\python\project\包管理
          D:\Anaconda3\envs\opp\python37.zip
          D:\Anaconda3\envs\opp\DLLs  
          D:\Anaconda3\envs\opp\lib
          D:\Anaconda3\envs\opp
          D:\Anaconda3\envs\opp\lib\site-packages
    
  • 添加搜索路径

      sys.path.append(dir)
    
  • 模块的加载顺序

    1. 搜索内存中已经加载好的模块
    2. 搜索python的内置模块
    3. 搜索sys.path路径

  • 包是一种组织管理代码的方式,包里面存放的是模块
  • 用于将模块包含在一起的文件夹就是包
  • 自定义包的结构
    |---包
    |---|---  __init__.py  包的标志文件
    |---|---  模块1
    |---|---  模块2
    |---|---  子包(子文件夹)
    |---|---|---  __init__.py
    |---|---|---  子包模块1
    |---|---|---  子包模块2
  • 包的导入操作

    • import package_name
      • 直接导入一个包,可以使用init.py中的内容

      • 使用方式是:

          package_name.func_name
          package_name.class_name.func_name()
        
      • 此种方式的访问内容是

      • 案例 pkg01, p07.py

        # pkg01.__init__py
        def inInit():
            print("I am in init of package")
    
        # pkg01.p01.py
        class Student():
            def __init__(self, name = "NoName", age = 18):
                self.name = name
                self.age = age
        
            def say(self):
                    print("My name is {0}".format(self.name))
        
            def sayHello():
                print("Hi, ")
    
    
        print("我是模块p01")
    
        # 案例 p07.py
        import pkg01
        
        pkg01.inInit()
    
          I am in init of package
    
    • import package_name as p

      • 具体用法跟作用方式,跟上述简单导入一致
      • 注意的是此种方法是默认对init.py内容的导入
    • import package.module

      • 导入包中某一个具体的模块

      • 使用方法

          package.module.func_name
          package.module.class.fun()
          package.module.class.var
        
      • 案例 p08.py

        # 案例 p08.py
        import pkg01.p01
        
        stu = pkg01.p01.Student()
        stu.say()
    
          我是模块p01
          My name is NoName
    
    • import package.module as pm
  • from ... import 导入

    • from package import module1, module2, module3, ... ...

    • 此种导入方法不执行 __init__ 的内容

        from pkg01 import p01
        p01.sayHello()
      
    • from package import *

      • 导入当前包 __init__.py 文件中所有的函数和类

      • 使用方法

          func_name()
          class_name.func_name()
          class_name.var
        
      • 案例 p09.py, 注意此种导入的具体内容

        # 案例 p09.py
        from pkg01 import *
        
        inInit()
        
        stu = Student() 
    
          I am in init of package
          
          NameError: name 'Student' is not defined
    
  • from package.module import *

    • 导入包中指定的模块的所有内容

    • 使用方法

        func_name()
        class_name.func_name()
      
  • 在开发环境中经常会引用其他模块,可以在当前包中直接导入其他模块中的内容

    • import 完整的包或者模块的路径
  • __all__ 的用法

    • 在使用from package import * 的时候,* 可以导入的内容
    • __init__.py 中如果文件为空,或者没有 __all__, 那么只可以把 __init__ 中的内容导入
    • __init__ 如果设置了 __all__ 的值,那么则按照 __all__ 指定的子包或者模块进行加载
      如此则不会载入 __init__ 中的内容
    • __all__=['module1', 'module2', 'package1'... ...]
    • 案例 pkg02,p10.py
        # pkg02.__init__.py
        __all__=['p01']
        
        def inInit():
            print("T am in init of package")
    
        # pkg02.p01.py
        class Student():
            def __init__(self, name = "NoName", age = 18):
                self.name = name
                self.age = age
    
            def say(self):
                print("My name is {0}".format(self.name))
        
            def sayHello():
                print("Hi, ")
        
        # 此判断语句建议一直作为程序的入口
        if __name__ == '__main__':
            print("我是模块p01")
    
        # 案例 p10.py
        from pkg02 import *
        
        stu = p01.Student()
        stu.say()
    
      My name is NoName
    

命名空间

  • 用于区分不同位置不同功能但相同名称的函数或者变量的一个特定前缀

  • 作用是防止命名冲突

      setName()
      Student.setName()
      Dog.setName()
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容