python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python 双下划线开头

Python 双下划线开头的具体使用

作者:自由生长2024

本文主要介绍了Python 双下划线开头的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在 Python 中,以两个下划线开头(如 __method)的方法或属性,并不完全是“私有方法”(private method)——因为 Python 并没有像 Java 或 C++ 那样严格的访问控制机制。但这种命名方式会触发一种叫做 名称改写(name mangling)的机制,从而在一定程度上实现“私有性”。

1. 名称改写(Name Mangling)

当你在一个类中定义一个以双下划线开头、且不以双下划线结尾的方法或属性时,Python 解释器会自动将其名称改写为:

_ClassName__original_name

例如:

class MyClass:
    def __init__(self):
        self.__private_var = 42

    def __private_method(self):
        return "This is private"

obj = MyClass()
# obj.__private_method()  # AttributeError!
print(obj._MyClass__private_method())  # 可以访问,但不推荐

虽然你仍然可以通过 _ClassName__name 的方式访问到这个“私有”成员,但这是一种约定+语言机制,目的是防止子类意外覆盖父类的内部方法,也提示开发者“这是内部使用的,不要直接调用”。

2. 与单下划线的区别

3. 特殊方法(魔术方法)例外

注意:如果方法名前后都有两个下划线(如 __init__, __str__),这是 Python 的特殊方法(也叫魔术方法),不会被名称改写,也不表示私有,而是用于实现特定语言特性。

1. 类的特殊方法(魔术方法)

以双下划线开头和结尾的方法,被称为特殊方法或者魔术方法(Magic Methods)。这些方法由 Python 解释器自动调用,我们可以通过重写它们来实现特定的类行为。

示例

class MyClass:
    def __init__(self, value):  # 实例初始化方法
        self.value = value
    
    def __str__(self):  # 定义实例的字符串表示
        return f"MyClass(value={self.value})"
    
    def __add__(self, other):  # 定义加法操作
        return MyClass(self.value + other.value)
    
    def __len__(self):  # 定义长度
        return len(str(self.value))

常用的魔术方法

4.与单下划线的区别

示例对比

class Parent:
    def _protected(self):  # 单下划线
        return "受保护的方法"
    
    def __private(self):  # 双下划线
        return "私有的方法"

class Child(Parent):
    pass

c = Child()
print(c._protected())  # 可以正常调用
print(c._Parent__private())  # 可以访问,但需要使用修饰后的名称
print(c.__private())  # 报错:AttributeError

4. 注意事项

总结

到此这篇关于Python 双下划线开头的具体使用的文章就介绍到这了,更多相关Python 双下划线开头内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文