面试题答案
一键面试单下划线开头的函数和变量(_func、_var)
- 模块内作用域:在模块内部,单下划线开头的函数和变量通常被视为“内部使用”的标识。虽然它们在模块内仍然可以被其他代码正常访问,但这是一种约定俗成的方式,告诉其他开发者这些函数或变量不应该在模块外部被直接使用。
- 导入影响:
- 当使用
import module
语句导入模块时,这些单下划线开头的函数和变量是可以通过module._func
或module._var
的方式访问的。 - 当使用
from module import *
语句导入模块时,默认情况下,单下划线开头的函数和变量不会被导入。这是 Python 为了避免在使用from...import *
时将过多“内部”的函数和变量导入到当前命名空间而采取的措施。不过,如果模块定义了__all__
列表,并且将单下划线开头的函数或变量包含在__all__
中,那么使用from module import *
时也会导入它们。
- 当使用
双下划线开头和结尾的函数和变量(init、name 等)
- 模块内作用域:双下划线开头和结尾的函数和变量是 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__
列表中明确包含,否则不会被导入到当前命名空间。
- 当使用