关于python:Python-包管理

43次阅读

共计 4659 个字符,预计需要花费 12 分钟才能阅读完成。

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()

正文完
 0