Python 包管理

举报
ruochen 发表于 2021/03/28 01:23:31 2021/03/28
【摘要】 1. 模块 一个模块就是一个包含python代码的文件,后缀名称是.py就可以,模块就是个python文件 为什么我们用模块 程序太大,编写维护非常不方便,需要拆分模块可以增加代码重复利用的方法当作命名空间使用,避免命名冲突 如何定义模块 模块就是一个普通文件,所以任何代码可以直接书写不过根据模块的规范,最好在本块中编写以下内容 函数(单一功能)类(相似功能的组...

1. 模块

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

  • 为什么我们用模块

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

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

    • 模块直接导入

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

      import module_name
      module_name.function_name
      module_name.class_name

    • 案例 01.py02.pyp01.pyp02.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")
    	
    
        
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    	# 案例 02.py
    	# 借助于importlib包可以实现导入以数字开头的模块名称
    	import importlib # 相当于导入了一个叫01的模块并把导入模块赋值给了a a = importlib.import_module("01")
    	stu = a.Student()
    	stu.say()
    
        
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    	# 案例 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")
    
        
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    	# 案例 p02.py
    	import p01 stu = p01.Student("xiaojing", 19) stu.say() p01.sayHello()
    
        
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
      	My name is xiaojing Hi, 
    
        
       
    • 1
    • 2
    • import 模块 as 别名
      • 导入的同时给模块起一个别名
      • 其余用法跟第一种相同
      • 案例 p03.py
     # 案例 p03.py
    	import p01 as p stu = p.Student("yueyue", 18)
    	stu.say()
    
        
       
    • 1
    • 2
    • 3
    • 4
    • 5
      	My name is yueyue
    
        
       
    • 1
    • from module_name import func_name, class_name
      • 按上述方法有选择性的导入
      • 使用的时候可以直接使用导入的内容,不需要前缀
      • 案例 p04
    	# 案例 p04.py
    	from p01 import Student, sayHello stu = Student() stu.say() sayHello()
    
        
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
     My name is NoName Hi, 
        
       
    • 1
    • 2
    • from module_name import *
      • 导入模块所有内容
      • 案例 p05.py
     # 案例 p05.py
    	from p01 import * sayHello() stu = Student("yaona", 20)
    	stu.say()
    
        
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
      	Hi, My name is yaona
    
        
       
    • 1
    • 2
  • if __name__ == ``__main__ 的使用

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

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

  • 什么是模块的搜索路径

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

      import sys
      sys.path  属性可以获取路径列表
      # 案例 p06.py
    
        
       
    • 1
    • 2
    • 3
    	# 案例 p06.py
    	import sys print(type(sys.path))
    	print(sys.path) for p in sys.path: print(p)
    
        
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
     <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
    
        
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 添加搜索路径

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

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

  • 包是一种组织管理代码的方式,包里面存放的是模块

  • 用于将模块包含在一起的文件夹就是包

  • 自定义包的结构

      |---包
      |---|---  __init__.py  包的标志文件
      |---|---  模块1
      |---|---  模块2
      |---|---  子包(子文件夹)
      |---|---|---  __init__.py
      |---|---|---  子包模块1
      |---|---|---  子包模块2
    
        
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 包的导入操作

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

      • 使用方式是:

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

      • 案例 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")
    
        
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    	# 案例 p07.py
    	import pkg01 pkg01.inInit()
    
        
       
    • 1
    • 2
    • 3
    • 4
      	I am in init of package
    
        
       
    • 1
    • import package_name as p

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

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

      • 使用方法

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

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

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

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

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

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

      • 使用方法

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

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

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

    • 使用方法

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

    • 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")
    
        
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    	# 案例 p10.py
    	from pkg02 import * stu = p01.Student()
    	stu.say()
    
        
       
    • 1
    • 2
    • 3
    • 4
    • 5
      My name is NoName
    
        
       
    • 1

命名空间

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

  • 作用是防止命名冲突

      setName()
      Student.setName()
      Dog.setName()
    
        
       
    • 1
    • 2
    • 3

文章来源: ruochen.blog.csdn.net,作者:若尘,版权归原作者所有,如需转载,请联系作者。

原文链接:ruochen.blog.csdn.net/article/details/90545715

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。