python-包管理(包、模块、命名空间)

1. 模块

  • 一个模块就是一个包含pytho代码的文件, 后n缀名成是.py就可以,模块就是个python文件
  • 为什么我们要用模块 
    • 程序太大,编写维护非常不方便,需要拆分
    • 模块可以增加代码重复利用的方式
    • 当做命名空间使用,避免命名冲突
  • 如何定义模块 
    • 模块就是一个普通文件,所以任何代码可以直接书写,
    • 不过根据模块的规范,最好在模块中编写以下内容 
      • 函数(单一功能)
      • 类(相似功能的组合,或者类似业务模块)
      • 测试代码
  • 如何使用模块

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

      import module_name 
      module_name.function_name 
      module_name.class_name

    • import 模块 as 别名

      • 导入的同时给模块起一个别名
      • 其余用法跟第一种相同
      • 案例 p03
    • from module_name import func_name, class_name

      • 按上述方法有选择性的导入
      • 使用的时候可以直接使用导入的内容,不需要前缀
      • 案例 p04
    • from module_name import *

      • 导入模块所有内容
      • 案例 p05
  • if __name__ == "__main__ 的使用 
    • 可以有效避免模块代码被导入的时候被动执行的问题
    • 建议所欲程序的入口都以此代码为入口

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

 

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

import sys
sys.path 属性可以获取路径列表
# 案例 p06.py
  • 添加搜索路径

     sys.path.append(dir)
    
  • 模块的加载顺序 
    1. 搜索内存中已经加载好的模块
    2. 搜索python的内置模块
    3. 搜索sys.path路径

3.包

  • 包是一种组织管理代码的方式,包里面存放的是模块
  • 用于将模块包含在一起的文件夹就是包
  • 自定义包的结构

    |---包
    |---|--- __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
    • import package_name as p

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

      • 导入包中某一个具体的模块,
      • 使用方法

        package.module.func_name
        package.module.class.fun()
        package.module.class.var
        
      • 案例 p08.py
    • 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, 注意此种导入的具体内容

  • 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'.........]

4.命名空间

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

    setName()
    Student.setName()
    Dog.setName()

 

案例

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("我是模块p01呀,你特么的叫我干毛")

02.py 

# 借助于importlib包可以实现导入以数字开头的模块名称
import importlib
 
# 相当于导入了一个叫01的模块并把导入模块赋值给了tuling
tuling = importlib.import_module("01")
 
 
stu = tuling.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("xiaojign", 19)
 
stu.say()
 
p01.sayHello()

p03.py

import p01 as p
 
stu = p.Student("yueyue", 18)
stu.say()

p04.py 

from p01 import Student, sayHello
 
 
stu = Student()
stu.say()
sayHello()

p05.py

from p01 import *
 
 
sayHello()
 
stu = Student("yaona", 28)
stu.say()

p06.py 

import sys
 
print( type(sys.path ))
print( sys.path )
 
for p in sys.path:
    print(p)

p07.py

import pkg01
 
pkg01.inInit()
 

p08.py

import pkg01.p01
 
stu = pkg01.p01.Student()
stu.say()

p09.py

from pkg01 import *
 
inInit()
 
stu = Student()

p10.py

from pkg02 import *
 
stu = p01.Student()
stu.say()
 
inInit()

包部分

pkg01

__init__.py

 def inInit():
    print("I am in init of package")

pkg02

__init__.py

 __all__=['p01']
 
def inInit():
    print("I am in inti of pacakge")

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中的命名空间是一种容器,用于存储可以映射到对象的名称。在Python中,有三种类型的命名空间:内置命名空间、全局命名空间模块命名空间。 内置命名空间是在Python解释器启动时创建的,其中含了内置模块、内置函数和内置异常等对象。它们的生命周期从Python解释器启动到退出。 全局命名空间是在解释器读取模块定义后创建的,含了当前模块的全局变量、函数、类以及导入的其他模块。全局命名空间的生命周期也是从Python解释器启动到退出。 模块命名空间是指在一个模块内部的命名空间。如果没有导入其他模块模块命名空间含了模块内部的全局变量、类和函数。每个模块都有自己独立的模块命名空间。 总结起来,Python的命名空间是用于存储对象和名称之间映射关系的容器,括内置命名空间、全局命名空间模块命名空间。这些命名空间相互独立,允许存在相同名称的对象。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [[python] 命名空间](https://blog.csdn.net/u011533352/article/details/128349966)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值