Skip to content

Latest commit

 

History

History
191 lines (129 loc) · 4.15 KB

202-532629-跨模块引用变量_namespace_的意义.sy.md

File metadata and controls

191 lines (129 loc) · 4.15 KB
show version enable_checker
step
1.0
true

跨模块引用变量

回忆

  • 上次我们研究了函数作为参数
  • 函数本质上是一个函数对象
    • 是一个callable的对象
    • 也有类型、地址

图片描述

  • 我们把函数作为实参传进去之后
  • 可以函数中完成调用
  • 这某种程度实现了抽象
  • 具体做什么操作是由函数参数决定
  • 我可以访问别的模块的参数么🤔

试着引用

  • main.py
import my_module
print(a)
  • my_module.py
global a
a = oeasy
  • 运行 main.py

图片描述

  • 不能直接找到a

图片描述

  • my_module模块内
    • 全局可见的变量a
    • 即使声明了global
    • 在main.py中也不可见
  • 那怎么才能看见这个a变量呢?

全局

图片描述

  • 只要说清楚a是哪里的a就可以了
  • a是my_module模块里面的a

图片描述

  • 如果a是在函数里声明的global变量
  • 在main.py里面可以访问么?

跨文件引用

  • 函数fun中
    • 声明了a 为
    • global全局类型

图片描述

  • 在main.py中还是找不到
  • 还是得在主程序部分定义变量

dir

图片描述

  • 确实可以通过名字空间来访问my_module的变量a

图片描述

  • 如果我导入两个模块呢?
  • 里面都有变量a

分别导入

  • my_module_2.py
a = "o2z"
  • 2个文件分别导入

图片描述

  • 2个a分别属于2个不同的模块
  • 这样也就可以用名字空间(namespace)区分不同的变量来源

图片描述

  • 导入的模块也可以通过inspect观察么?

观察

图片描述

  • 尝试一下

输出

import my_module
import inspect
members = inspect.getmembers(my_module)
for element in members:
    print(element)
  • 尝试运行

图片描述

结果

  • 可以找到

图片描述

  • 这样确实可以观察到模块的一些信息
    • __doc__ 文档手册信息
    • __file__ 文件来源
    • 甚至anoterh模块的全局(global)变量i
  • 使用模块名字空间(namespace)有什么意义呢

名字空间的意义

  • 帮助文件中

图片描述

  • 用名字空间
  • 区分不同的函数来源
  • 如果用from ... import...呢

from ... import...

from my_module import a
from my_module_2 import a
print(a)
  • 运行

图片描述

  • 执行结果是o2z
  • 这如何理解呢?

撞车(local name crash)

图片描述

  • 解决方式
    • from ... import ... as ...
  • 尝试修改 代码
    • 能将两个a分别输出

总结

  • 这次我们研究了文件模块(module)
    • 不同的模块有各自的全局(global)变量字典
  • import A之后
    • 可以用A.a引用A模块内的全局(global)变量
    • 也可以引入(import)别的模块的全局(global)变量
    • 彼此不会互相影响
  • 如果都使用from A import a这种模式
    • 可能a会被其他的模块中a覆盖
    • 这有点危险
  • 各种数据来自不同的名字空间
    • time
    • math
    • oeasy
    • __builtins__
  • 已经有一些比较成熟的模块了
  • 如何理解这些已经内建好的模块呢?🤔
  • 下次再说👋