Skip to content

Latest commit

 

History

History
142 lines (96 loc) · 3.63 KB

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

File metadata and controls

142 lines (96 loc) · 3.63 KB
show version enable_checker
step
1.0
true

跨模块引用变量

回忆

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

图片描述

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

试着引用

图片描述

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

全局

  • 只要说清楚a是哪里的a就可以了

图片描述

  • a是another模块里面的a

图片描述

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

跨文件引用

图片描述

  • 声明了global

  • 在another.py中全局可见

  • 在one.py中还是找不到

  • 还是得在主程序部分定义变量

dir

图片描述

  • 我们确实可以通过名字空间来访问another的变量a
  • 如果我导入两个模块呢?
  • 里面都有变量a

分别导入

  • 2个文件分别导入

图片描述

  • 2个a分别属于2个不同的模块
  • 这样也就可以用名字空间(namespace)区分不同的变量来源
  • 导入的模块也可以通过inspect观察么?

观察

图片描述

  • 尝试一下

输出

图片描述

图片描述

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

名字空间的意义

  • 帮助文件中

图片描述

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

from ... import...

图片描述

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

汇编

图片描述

  • 第2句把第1句中的a给代替掉了
  • 这就容易引起误会
  • 所以说
    • Namespaces are one honking great idea -- let's do more of those!
    • 命名空间是一种绝妙的理念,我们应当积极使用
      • 同样是变量名a
      • 可以用名字空间来区分
      • 不会引起误解和替换

总结

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