1. 单下划线与双下划线
在Python中,单下划线和双下划线有特殊的含义。
1.1 单下划线的含义
在Python中,以单下划线开头的变量、方法或属性,一般被视为私有,表示为内部使用,不推荐外部直接访问。
class MyClass:
def __init__(self):
self._private_variable = 10 # 私有变量
def _private_method(self):
pass # 私有方法
my_object = MyClass()
print(my_object._private_variable)
my_object._private_method()
虽然可以从外部直接访问这些以单下划线开头的内容,但是一般约定外部不要直接使用,而是通过公共的接口进行访问。
1.2 双下划线的含义
在Python中,以双下划线开头且不以双下划线结尾的变量、方法或属性,被视为私有成员,使用名字修饰技术进行访问。
class MyClass:
def __init__(self):
self.__private_variable = 10 # 私有变量
def __private_method(self):
pass # 私有方法
my_object = MyClass()
print(my_object.__private_variable) # 报错
my_object.__private_method() # 报错
使用双下划线开头的成员,会在名称前面添加一个下划线和类名,从而变成类似"_ClassName__name"的形式,这是Python进行名称重整(Name Mangling)的机制,目的是防止子类意外地重写了父类的方法或属性。
需要注意的是,双下划线结尾的成员不会进行名称重整,主要用于Python内置的魔术方法,如__init__和__str__等。
2. 绝对导入与相对导入
在Python中,导入模块是非常常见的操作,可以使用绝对导入和相对导入两种方式。
2.1 绝对导入
绝对导入是指使用完整的包名和模块名来导入模块。
import mypackage.module
在绝对导入中,模块名需要提供完整的路径信息,能够准确地找到模块所在位置。这种导入方式适用于模块比较独立,和当前工作路径没有直接关联的情况。
2.2 相对导入
相对导入是指使用相对于当前模块的位置来导入模块,不需要提供完整的包名和模块名。
from . import module
在相对导入中,包和模块的位置相对于当前模块进行查找。相对导入适用于模块与当前工作路径有关联且随着项目位置的变动而变动的情况。
需要注意的是,Python 3.x版本中规定了相对导入必须使用显式的相对导入语法,如使用点(.)表示当前模块,使用点点(..)表示上级模块。
from .subpackage import sub_module
在上述示例中,使用相对导入从当前模块所在的包的subpackage目录中导入sub_module模块。
绝对导入和相对导入在不同的场景中有不同的用途,选择合适的导入方式可以使得代码更加清晰易读。
总结
本文介绍了Python中的单下划线和双下划线的含义以及绝对导入和相对导入的用途。
单下划线和双下划线被用来表示私有成员,区分了内部和外部可访问性。虽然可以从外部直接访问单下划线开头的成员,但一般不推荐这样做,应该通过公共接口进行访问。双下划线开头的成员会进行名称重整,以防止子类意外地重写父类的方法或属性。
绝对导入是使用完整的包名和模块名来导入模块,适用于模块比较独立的情况。相对导入是使用相对于当前模块的位置来导入模块,适用于模块与当前工作路径有关联的情况。
正确地使用单下划线、双下划线、绝对导入和相对导入可以使得代码更加清晰易读,提高代码的可维护性。