1.概述
在Python中,有三种下划线形式的命名方式,分别是一个下划线、两个下划线以及两个下划线夹在两个下划线之间的命名方式,即:
name
_name
__name
__name__
这三种命名方式都有各自的使用场景和作用。
2.单下划线“_”(1个下划线)
2.1使用场景
单下划线“_”用作前缀,用来表示这个变量或方法是内部使用的,即“私有”的。但它并不像Java中的private那样严格约束外部不可引用,此时只是一种约定,实际上这个变量或方法可以被引用和修改,只是表示一种非公共的使用方式。
2.2示例
class Person():
def __init__(self,name):
self._name=name
p=Person('Tom')
print(p._name)
p._name="Jack"
print(p._name)
用单下划线“_”来约定属性或方法是内部使用的,但实际上仍然可以被外部程序改写。
3.双下划线“__”(2 个下划线)
3.1使用场景
双下划线“__”用作前缀和后缀,即被称为Python中的魔法方法(Magic Method),也被称为 Dunder (double underscore),例如“__init__”。
使用双下划线“__”作为前缀命名变量或函数时,Python会将变量名或函数名重命名为“_类名__变量名”或“_类名__函数名”的形式,以保证子类重载父类中的同名函数或变量时不会出现冲突,即使子类中的同名函数或变量没有使用双下划线进行 private 化。
3.2示例
class Person():
def __init__(self,name,age):
self.name=name
self.__age=age
p=Person('Tom',18)
print(p.name)
try:
print(p.__age)
except Exception as e:
print(e)
print(p._Person__age)
输出结果为:
Tom
'Person' object has no attribute '__age'
18
双下划线“__”将“age”变为“_Person__age”,实际上父类中的“__age”变量已经被存储在“_Person__age”变量中,因此在类的外部无法访问双下划线“__age”这个变量,而是要通过“_Person__age”这个名称来访问。
4.双下划线夹在两个下划线之间“__xx__”
4.1使用场景
双下划线夹在两个下划线之间的命名方式是Python中的特殊方法名,也是Python的魔法方法,例如 __init__、__new__等。
这些特殊方法名有着特殊的用途,它们是Python中处理代码与数据的核心机制。这些方法是相当底层和高级的,面向不同的Python用户。
4.2示例
class Person():
def __init__(self,name,age):
self.name=name
self.age=age
def __str__(self):
return "Person's name is %s, age is %d"%(self.name,self.age)
p=Person('Tom',18)
print(p)
输出结果为:
Person's name is Tom, age is 18
这里我们需要用到的特殊方法是“__str__”,这是一个定义了对象被转化为字符串时的规律的特殊方法。
5.总结
在Python中,单下划线“_”表示私有属性或方法,在类的外部可以访问但不遵循约定的情况下仍可改写;双下划线“__”将属性或方法私有化并重命名为“_类名__变量名”或“_类名__函数名”,以保证同名属性或方法的碰撞;双下划线夹在两个下划线之间的命名方式是Python中的特殊方法名,它们是Python中处理代码与数据的核心机制。
我们需要根据不同的使用场景和需求来灵活使用这三种命名方式,以达到代码的可读性、可维护性和高效性。