面试题答案
一键面试1. __name__
值在不同模块中的变化
- 模块C:当模块C被导入时,
__name__
的值为模块C本身的名称。例如,如果模块C的文件名是module_c.py
,那么在模块C内部__name__
的值为'module_c'
。 - 模块B:模块B导入模块C,模块B自身的
__name__
值为模块B本身的名称。例如,如果模块B的文件名是module_b.py
,那么在模块B内部__name__
的值为'module_b'
。同时,在模块B中导入模块C时,模块C的__name__
值依然是'module_c'
。 - 模块A:模块A导入模块B,模块A自身的
__name__
值为模块A本身的名称。例如,如果模块A的文件名是module_a.py
,那么在模块A内部__name__
的值为'module_a'
。在模块A导入模块B后,模块B的__name__
值为'module_b'
,模块B中导入的模块C的__name__
值为'module_c'
。
2. 对模块之间协作和作用域的影响
- 协作方面:
- 唯一标识:每个模块的
__name__
提供了一个唯一的标识,使得模块之间可以准确引用。例如,模块A通过import module_b
导入模块B,模块B又通过import module_c
导入模块C,通过__name__
可以确保每个模块在系统中的唯一性,避免命名冲突,从而实现有序的协作。 - 条件执行:在模块内部,可以根据
__name__
的值来决定代码的执行逻辑。比如,在模块C中可以添加如下代码:
- 唯一标识:每个模块的
if __name__ == '__main__':
# 模块C作为主程序运行时执行的代码
print('Module C is run as the main program')
这样,当模块C被其他模块导入时,这段代码不会执行;只有当模块C直接作为主程序运行时,这段代码才会执行。这为模块在不同使用场景下提供了灵活的执行逻辑,方便模块之间的协作。
- 作用域方面:
- 模块级作用域:
__name__
有助于界定模块级作用域。每个模块都有自己独立的命名空间,其__name__
是这个命名空间的标识之一。模块内定义的变量、函数等,其作用域通常局限于模块内部,通过__name__
可以清晰地划分不同模块的作用域边界。例如,模块A中的变量a
和模块B中的变量a
不会冲突,因为它们处于不同的模块作用域,由各自模块的__name__
标识。 - 导入时的作用域传递:当模块A导入模块B,模块B导入模块C时,模块C的作用域并没有直接暴露给模块A。模块A只能通过模块B来间接访问模块C的功能,这维护了模块之间作用域的层次结构和封装性。模块B可以根据需要,有选择地将模块C的部分功能暴露给模块A,从而控制模块之间的耦合度。
- 模块级作用域: