下面是关于Python五种下划线的详细讲解及示例说明。
一、概述
在Python中,下划线(_)有五种不同的使用方式,它们分别是:
- 单个下划线:命名约定,表示弱内部使用,不会呈现在from module import *
- 单个前置下划线:命名约定,表示为非导出属性或方法
- 单个后置下划线:用于避免与Python关键字名称的冲突
- 双前置下划线:名称修饰,用于使属性变成私有(实际上还是被Python重命名了)
- 双前后置下划线:名称修饰,用于避免名称与父类属性或方法的冲突
下面我将分别对以上不同用法进行详细解释,并提供相应的示例。
二、单个下划线
单个下划线在Python中是一种命名约定,表示该属性或者方法仅供内部使用。这意味着,如果在模块中使用from module import * 进行导入,该属性或方法并不会被导入。因此,单个下划线经常被用来声明实现细节的非公共成员,即使这些非公共成员会在外部被使用。
示例:
class A:
def __init__(self):
self.public_var = 1
self._private_var = 2
a = A()
print(a.public_var) #输出 1
print(a._private_var) #输出 2
在上面的代码中,我们定义了一个类A,其中包含两个变量public_var和_private_var。其中public_var是公共成员,可以直接被外部程序访问,而_private_var是单个下划线下的成员,属于弱内部使用,但并不表示不能被外部访问。实际上,我们在使用print(a._private_var)输出_private_var时,可以发现输出的结果正是2。
三、单个前置下划线
单个前置下划线是一种命名约定,表示该属性或者方法只在类或模块内部使用。它并不会限制内部的调用,但外部调用会受到警告。单个前置下划线并不会防止外部调用使用这个属性或方法,但它可以让外部调用者更谨慎地使用它们。
示例:
class A:
def __init__(self):
self.public_var = 1
self._private_var = 2
self.__very_private_var = 3
a = A()
print(a.public_var) #输出 1
print(a._private_var) #输出 2
print(a.__very_private_var) #报错 AttributeError: 'A' object has no attribute '__very_private_var'
在以上代码中,我们在类A内部定义了三个变量,分别是public_var、_private_var、__very_private_var,并打印了此三个变量的值。由于在Python中具有名称修饰的特性,__very_private_var实际上在类A内部已经被重命名成了_A__very_private_var。因此,如果我们尝试直接使用__very_private_var,就会出现报错。
四、单个后置下划线
单个后置下划线通常用于避免与Python关键字或已有的标识符名称的冲突。通常将下划线与已有名称的结尾相连,因为这样可以清楚地表示该名称不同于已有名称,但这并不会改变名称的意义。
示例:
class A:
def __init__(self):
self.class_ = "class"
self.import_ = "import"
a = A()
print(a.class_) #输出 class
print(a.import_) #输出 import
在以上代码中,我们在类A内部初始化了两个变量,分别是class_和import_。这两个变量都是已有的Python关键字,并且与内置函数有冲突。因此,我们在使用这两个变量时,在它们的名称末尾添加单个下划线,来避免冲突,同时也保留了名称的意义。
五、双前置下划线
双前置下划线用于进行名称修饰,将属性变成私有。通过这种方式,我们可以避免在子类中意外覆盖来自父类的属性,在方法之前添加双下划线即可修饰。
在Python中,双下划线会导致Python重命名属性或者方法,以避免与子类属性相冲突。Python会将属性名字改成_类名__属性名,这个过程就称为名称修饰。
示例:
class A:
def __init__(self):
self.__very_private_var = 1
class B(A):
def __init__(self):
super().__init__()
self.__very_private_var = 2
b = B()
print(b._A__very_private_var) #输出 1
print(b._B__very_private_var) #输出 2
在以上代码中,我们定义了两个类A、B,并在类A中定义了私有变量__very_private_var,在类B中覆盖了__very_private_var,并定义了实例b。我们可以发现,由于类A中的私有变量已经重命名成了_A__very_private_var,因此当我们想要输出类A中的私有变量时,可以使用b._A__very_private_var,而想要输出类B中的私有变量时,可以使用b._B__very_private_var。
六、双前后置下划线
双前后置下划线与双下划线类似,也是一种名称修饰。通常,这种方法用于避免子类的名称与父类的名称冲突,例如,如果我们在子类中定义了一个方法名为__init__,那么子类将会覆盖父类中的__init__方法。因此,当我们想要在子类中使用此方法时,需要使用名称修饰。
示例:
class A:
def __init__(self):
self.public_var = 1
self.__very_private_var = 2
class B(A):
def __init__(self):
super().__init__()
self.public_var = 3
self.__very_private_var = 4
b = B()
print(b.public_var) #输出 3
print(b._A__very_private_var) #输出 2
print(b._B__very_private_var) #输出 4
在上面的代码中,我们定义了两个类A、B,并在类A中定义了公共变量public_var和私有变量__very_private_var。在类B中,我们通过名称修饰的方式重写了类A中的方法,并初始化了公共变量和私有变量。在输出时,我们可以发现,public_var被成功重写,并输出了3,而B类中的私有变量和A类中的私有变量分别被重命名成了_B__very_private_var和_A__very_private_var,输出时也可以按照此方式输出。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python五种下划线详解 - Python技术站