python中 _、__、__xx__()区别及使用场景

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中处理代码与数据的核心机制。

我们需要根据不同的使用场景和需求来灵活使用这三种命名方式,以达到代码的可读性、可维护性和高效性。

后端开发标签