python - 当我们导入一个模块时,我们是否只是让主模块可以访问导入模块的命名空间?

标签 python oop object module namespaces

如果这是真的,那么 Python 中的任何对象都只是一个命名空间吗?因为当我们导入一个模块时,我们使用与对象相同的点约定( example: module.function() & obj.method() )访问模块中的名称。我认为访问对象的属性或方法只是为您要访问的属性/方法指定命名空间。这是真的?

最佳答案

不,您还通过运行其中的所有顶级语句来初始化导入的模块(仅在第一次导入时)。
通过模块名称获得的引用可以访问导入的模块命名空间。这个命名空间是用字典实现的,并访问 mod.some_attribute与访问 mod.__dict__['some_attribute'] 相同.

Is any object just a namespace ?


不,它是更多的东西(它拥有一个命名空间,它不是一个)。每个对象都是某个类的实例。自定义类碰巧以与模块相同的方式实现命名空间,使用内部 __dict__ .
模块在 Python 文档中被称为代码的组织单位。事实上,您可以以同样的方式思考类,因为它们为您提供命名空间功能。
但是在模块中搜索属性时没有考虑继承树,就像类/对象一样。
如果你想要一个命名空间对象只是为了命名空间本身的好处,请使用 dict ,或空的 class .甚至还有一个 types.SimpleNamespace类。

I think accessing an attribute or a method of an object is just specifying the namespace for the attribute/method you'd like to access. Is this true ?


或多或少(即是的,除了“公正”这个词)。它使用对象名称(引用)来获取 namespace ,并使用属性名称作为基础 namespace __dict__ 的键。对象,但隐式钩子(Hook)可能会在幕后运行代码。

关于python - 当我们导入一个模块时,我们是否只是让主模块可以访问导入模块的命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63579253/

相关文章:

python - 使用 apply() 合并 Pandas DataFrame 仅在两列中部分匹配时合并

python - Odoo 错误,伙伴无法关注同一个对象两次

javascript - Function.prototype.method 什么是原型(prototype)[名称]

javascript - 函数如何适应传递不同对象作为参数的调用?

javascript - 函数构造函数 - 使用原型(prototype)添加函数给出 - 未捕获的语法错误 : Unexpected token {

python - 在pygame中创建多个实例

python - 正则表达式中的返回组与字符串匹配

javascript - 使用原型(prototype)与直接在构造函数中定义方法的优势?

java - 派生类如何调用基类的私有(private)方法?

c++ - 对 Class::Class/Function 的 undefined reference (OOP 初学者)