下面我来详细讲解Python中的五种下划线含义。
一、单下划线(_)
在Python中,以单下划线开头的变量、方法或者属性,表示这是一个私有的成员,外界不应该直接访问,但是这并不是真正意义上的私有,Python并没有像其他语言那样提供严格的访问控制。因此,开发者需要自觉遵守约定,不要直接访问私有成员,而应该通过公共接口来进行操作。
示例:
class Person:
def __init__(self, name, age):
self._name = name
self._age = age
def _get_age(self):
return self._age
def get_info(self):
return f"I'm {self._name}, {self._get_age()} years old."
person = Person("Lucy", 20)
print(person.get_info())
在这个示例中,我们使用单下划线开头对属性和方法进行了「假私有」处理,外部代码没有办法直接访问。如果我们直接使用person._name
或者person._get_age()
的话,其实是可以正常访问的,但是这么做不好,会影响代码的可读性和可维护性。所以我们在编写代码的时候,需要按照约定来进行操作。
二、双下划线(__)
以双下划线开头(但不以双下划线结尾)的变量、方法或者属性,Python会对其进行名称修饰,使得其在类的内部和外部都无法直接访问。这个过程叫做「名称修饰」,Python将变量名,改为了 _类名__变量名
的格式。
示例:
class A:
def __init__(self):
self.__b = "hello"
a = A()
# print(a.__b) # 报错,外部无法访问
print(a._A__b) # 可以正常访问
在这个例子中,我们定义了一个A类,并在其中使用双下划线开头的b属性。我们可以看到,如果直接访问a.__b的话,会报错;但是如果我们通过a._A__b来访问,就可以正常得到结果了。不过,这种方式并不推荐使用,因为这样会导致代码在其他类中无法重用。
三、单下划线(_)和双下划线(__)的区别
单下划线开头和双下划线开头的属性和方法,在类的内部都是可以被正常访问的,但是在外部的使用上,就有所区别了。
- 使用单下划线开头声明的属性和方法,表示这是一个约定俗成的「伪私有」成员,不应该直接访问,无法通过 from module import * 导入。
- 使用双下划线开头声明的属性和方法,Python会进行名称修饰,尽可能地避免与其他属性和方法名冲突,使得其在内部和外部都无法直接访问。
示例:
class Example:
def __init__(self):
self._name = "Tom" # 以单下划线开头
def __get_name(self): # 以双下划线开头
return self._name
exp = Example()
print(exp._name) # 可以访问,但不推荐这么做
# print(exp.__get_name()) # 外部无法直接访问
print(exp._Example__get_name()) # 可以访问,但不推荐这么做
四、单下划线(_)的其他用途
除了上面提到的「伪私有」,单下划线还有一些其他的使用场景。
1、占位符
单下划线在Python中被用作一个占位符,给变量或者函数参数预留了位置,表示这是一个不重要的、丢弃的值,不会被直接使用。在Python中,也有些库经常会使用「_」来表示丢弃的返回值。
示例:
def do_something():
for _ in range(5):
print("hello world")
do_something()
在这个例子中,我们定义了一个函数do_something()
,并使用单下划线来代替循环变量的名字,表示循环变量实际上没有被使用,用单下划线「_」来进行占位。
2、防止命名重复
在Python中,有些时候我们需要在子类中重新定义父类的同名方法或属性,并希望在子类中能够区分开来。这个时候,我们就可以使用单下划线来防止名称冲突。
示例:
class Base:
def __init__(self):
self.x = 0
class Sub1(Base):
def __init__(self):
super().__init__()
self._x = 1
class Sub2(Base):
def __init__(self):
super().__init__()
self._x = 2
sub1 = Sub1()
sub2 = Sub2()
print(sub1.x, sub1._x) # 0 1
print(sub2.x, sub2._x) # 0 2
在这个例子中,我们定义了一个Base
类,并分别在Sub1
和Sub2
中重新定义了x
属性。我们使用了单下划线来对子类中的属性进行「重命名」,避免了属性名的冲突。
五、双下划线开头和结尾(xxx)
双下划线开头和结尾的变量是Python特殊的名称,也被称为 「魔法方法」。这些变量在Python中有着特殊的用途,它们定义了类的行为和属性,但是一般情况下,并不需要我们手动去调用它们。
示例:
class MyClass:
def __init__(self, value):
self.__value = value
def __str__(self):
return f"MyClass's value is {self.__value}."
def __add__(self, other):
result = MyClass(self.__value + other.__value)
return result
a = MyClass(10)
b = MyClass(20)
print(a)
print(a + b)
在这个例子中,我们定义了一个MyClass
类,并重写了类中的__init__
、__str__
、__add__
方法。这三个方法是Python的「魔法方法」,定义了类的构造、字符串打印、运算行为等特殊操作,可以使得开发者更好地使用类和对象。
总之,Python中的下划线有很多特殊含义,开发者在进行编程时,需要根据各种情况灵活使用,遵守约定。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:通俗讲解Python中的五种下划线含义 - Python技术站