面试题答案
一键面试- Python处理命名冲突方式:
- 当从不同模块导入具有相同名称的类时,Python按导入顺序覆盖命名空间。后导入的同名类会覆盖先导入的同名类。例如:
from module1 import MyClass from module2 import MyClass # 此时MyClass指的是module2中的MyClass,module1中的MyClass被覆盖
- 避免冲突的导入方式:
- 使用
as
关键字重命名:在导入时使用as
关键字为导入的类指定不同的别名。
from module1 import MyClass as MyClass1 from module2 import MyClass as MyClass2
- 导入整个模块而不是特定类:通过导入整个模块,使用模块名作为前缀来访问类,避免命名冲突。
import module1 import module2 obj1 = module1.MyClass() obj2 = module2.MyClass()
- 使用
- 不同作用域下导入类的影响:
- 全局作用域:在全局作用域导入类,类在整个模块内可见。所有函数和代码块都能使用该导入的类。例如:
from my_module import MyClass def my_function(): obj = MyClass() # 可以在函数内使用MyClass
- 局部作用域:在函数或代码块等局部作用域导入类,类仅在该局部作用域内可见。这样做可以减少全局命名空间的污染,但如果在不同局部作用域重复导入相同类,可能会影响性能。例如:
def my_function(): from my_module import MyClass obj = MyClass() # MyClass仅在这个函数内可见
- 另外,局部作用域导入可能会导致名称解析问题,如果在函数内有与导入类同名的局部变量,会优先使用局部变量。例如:
def my_function(): MyClass = "local variable" from my_module import MyClass # 这里会报错,因为局部变量MyClass已经存在,Python会优先使用它,而不是导入的类