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

作者:

文章目录
  • 当你在一个类中定义一个以双下划线开头、且不以双下划线结尾的方法或属性时,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 的方式访问到这个“私有”成员,但这是一种约定+语言机制,目的是防止子类意外覆盖父类的内部方法,也提示开发者“这是内部使用的,不要直接调用”。
  • 单下划线开头(如 _method):只是约定表示“内部使用”,不会触发名称改写,外部仍可访问。 双下划线开头(如 __method):触发名称改写,提供更强的封装暗示。
  • 注意:如果方法名前后都有两个下划线(如 __init__, __str__),这是 Python 的特殊方法(也叫魔术方法),不会被名称改写,也不表示私有,而是用于实现特定语言特性。
  • 单下划线(_method):这是一种约定,表示方法是受保护的(protected),不应该在类外部直接使用。不过 Python 并不会强制限制这种访问。 双下划线(__method):会通过名称修饰机制,让方法更难以被外部访问,主要用于避免子类命名冲突。 示例对比: 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
  • Python 没有真正的“私有方法”。 __method 会被名称改写,起到模拟私有的作用。 仍可通过 _ClassName__method 访问,但应避免这样做。 这是一种约定 + 语言机制,用于封装和避免命名冲突。 到此这篇关于Python 双下划线开头的具体使用的文章就介绍到这了,更多相关Python 双下划线开头内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: Python中单、双下划线的区别总结 浅谈python 里面的单下划线与双下划线的区别 python中单下划线(_)和双下划线(__)的特殊用法 Python中的单下划线和双下划线使用场景详解 Python3中_(下划线)和__(双下划线)的用途和区别 Python中单下划线和双下划线的使用详解 一文带你掌握Python中的双下划线写法 python中单下划线与双下划线的区别及说明 python常用的魔法方法(双下划线) python里面单双下划线的区别详解
  • 目录
    • 1. 名称改写(Name Mangling)
    • 2. 与单下划线的区别
    • 3. 特殊方法(魔术方法)例外
      • 1. 类的特殊方法(魔术方法)
    • 4.与单下划线的区别
      • 4. 注意事项
    • 总结

      在 Python 中,以两个下划线开头(如 __method)的方法或属性,并不完全是“私有方法”(private method)——因为 Python 并没有像 Java 或 C++ 那样严格的访问控制机制。但这种命名方式会触发一种叫做 名称改写(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 的方式访问到这个“私有”成员,但这是一种约定+语言机制,目的是防止子类意外覆盖父类的内部方法,也提示开发者“这是内部使用的,不要直接调用”。

      • 单下划线开头(如 _method):只是约定表示“内部使用”,不会触发名称改写,外部仍可访问。
      • 双下划线开头(如 __method):触发名称改写,提供更强的封装暗示。

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

      以双下划线开头和结尾的方法,被称为特殊方法或者魔术方法(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))
      

      常用的魔术方法

      • __init__:对象初始化
      • __str__ 和 __repr__:字符串表示
      • __len__:长度
      • __add____sub____mul__:算术运算符
      • __eq____lt____gt__:比较运算符
      • __iter__ 和 __next__:迭代器协议
      • __getitem__ 和 __setitem__:索引操作

      • 单下划线(_method):这是一种约定,表示方法是受保护的(protected),不应该在类外部直接使用。不过 Python 并不会强制限制这种访问。
      • 双下划线(__method):会通过名称修饰机制,让方法更难以被外部访问,主要用于避免子类命名冲突。

      示例对比

      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
      

      • 避免过度使用双下划线:除非确实需要防止子类覆盖方法,否则建议使用单下划线来表示约定上的私有性。
      • 特殊方法和私有方法:不要混淆特殊方法(如 __str__)和私有方法(如 __private)。特殊方法是 Python 语言的一部分,而私有方法是类设计的一种选择。

      • Python 没有真正的“私有方法”。
      • __method 会被名称改写,起到模拟私有的作用。
      • 仍可通过 _ClassName__method 访问,但应避免这样做。
      • 这是一种约定 + 语言机制,用于封装和避免命名冲突。

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

      您可能感兴趣的文章:

      • Python中单、双下划线的区别总结
      • 浅谈python 里面的单下划线与双下划线的区别
      • python中单下划线(_)和双下划线(__)的特殊用法
      • Python中的单下划线和双下划线使用场景详解
      • Python3中_(下划线)和__(双下划线)的用途和区别
      • Python中单下划线和双下划线的使用详解
      • 一文带你掌握Python中的双下划线写法
      • python中单下划线与双下划线的区别及说明
      • python常用的魔法方法(双下划线)
      • python里面单双下划线的区别详解

      站内搜索