MST

星途 面试题库

面试题:Python 模块中不同下划线命名的作用域及导入影响

在 Python 模块里,有单下划线开头的函数(_func)、双下划线开头和结尾的函数(__init__)等不同命名方式的函数和变量。请详细说明这些不同命名方式如何影响它们在模块内的作用域,以及当使用不同的导入语句(如 import module,from module import * 等)时,对这些对象的导入有何影响?
44.2万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

单下划线开头的函数和变量(_func、_var)

  • 模块内作用域:在模块内部,单下划线开头的函数和变量通常被视为“内部使用”的标识。虽然它们在模块内仍然可以被其他代码正常访问,但这是一种约定俗成的方式,告诉其他开发者这些函数或变量不应该在模块外部被直接使用。
  • 导入影响
    • 当使用 import module 语句导入模块时,这些单下划线开头的函数和变量是可以通过 module._funcmodule._var 的方式访问的。
    • 当使用 from module import * 语句导入模块时,默认情况下,单下划线开头的函数和变量不会被导入。这是 Python 为了避免在使用 from...import * 时将过多“内部”的函数和变量导入到当前命名空间而采取的措施。不过,如果模块定义了 __all__ 列表,并且将单下划线开头的函数或变量包含在 __all__ 中,那么使用 from module import * 时也会导入它们。

双下划线开头和结尾的函数和变量(initname 等)

  • 模块内作用域:双下划线开头和结尾的函数和变量是 Python 中的特殊方法或属性,它们有着特定的用途和意义。这些特殊的函数和变量在模块内部和外部都有特定的行为和作用。例如,__init__ 方法用于类的初始化,__name__ 属性用于获取模块的名称。它们在模块内部是作为模块功能的一部分被正常使用的。
  • 导入影响
    • 无论是使用 import module 还是 from module import *,这些双下划线开头和结尾的函数和变量都会被正常导入(如果模块定义了相关的特殊方法或属性)。例如,__name__ 属性在模块被导入后可以通过 module.__name__ 访问(import module 方式),或者直接在当前命名空间中访问(from module import * 方式)。这些特殊的名称在 Python 中有固定的用途,所以总是可以被导入和使用。

双下划线开头但结尾没有双下划线的函数和变量(__func)

  • 模块内作用域:在类中,双下划线开头但结尾没有双下划线的函数和变量会触发名称改写机制。例如,在类 A 中定义 __func,实际上它会被改写成 _A__func。这种机制主要是为了避免子类中定义的同名属性或方法与父类中的冲突。在模块层面,这种命名方式并没有特殊的作用域影响,它只是被视为一个普通的以双下划线开头的名称。
  • 导入影响
    • 当使用 import module 语句导入模块时,它们可以通过 module.__func(实际上可能是改写后的名称 module._ModuleName__func)的方式访问。
    • 当使用 from module import * 语句导入模块时,默认情况下不会导入。和单下划线开头的情况类似,除非在 __all__ 列表中明确包含,否则不会被导入到当前命名空间。