Python中单下划线,双下划线,俩头下划线的区别。

示例

>>> 
    class student(object):
    __name = 0
    _sex = 'male'


>>> student.__dict__
mappingproxy({'__module__': '__main__', '_student__name': 0, '_sex': 'male', '__dict__': <attribute '__dict__' of 'student' objects>, '__weakref__': <attribute '__weakref__' of 'student' objects>, '__doc__': None})

>>> student.__name
Traceback (most recent call last):
  File "<pyshell#58>", line 1, in <module>
    student.__name
AttributeError: type object 'student' has no attribute '__name'

>>> student._student__name

>>> student._sex
'male'

认真看 ,细心地你会发现问题所在

    总结:我们声明了一个学生类,分别用但下划线和双下划线定义了一个成员,然后我们试图访问成员,我们发现:双下划线的成员无法直接访问,通过__dict__我们看到,在类的内部,Python自动将__name 解释成 _student__name,于是我们用 _student__name访问,这次成功。然而,_name不受影响。所以:

两头下划线:Python类内置成员专用,区别用户自定义成员

单下划线:类的普通成员

爽下划线:解析器自动转换为:_类名__成员名,代替原有成员,访问需要在原有成员名字前加上_类名。
### Python下划线下划线区别 #### 下划线 `_variable` 在 Python 编码约定中,以下划线开头的成员名(如 `_object`),通常表示该成员是受保护的或私有的。这种命名方式是一种惯例,并不强制执行访问控制;它更多是为了提醒开发者这些属性不应该直接访问。 ```python class Example: def __init__(self): self._private_var = "This is a protected variable" example_instance = Example() print(example_instance._private_var) # 虽然可以访问,但这不符合编码规范 ``` #### 下划线 `__variable` 当类中的属性名以前置下划线定义时(如 `__object`),Python 解释器会对这个名称进行重写处理,即所谓的“名称改写”(name mangling),目的是为了防止子类意外覆盖基类的方法或属性[^2]。 ```python class BaseClass: def __init__(self): self.__mangled_variable = "Mangled Variable" base_instance = BaseClass() # 尝试直接访问会引发 AttributeError 错误 try: print(base_instance.__mangled_variable) except AttributeError as e: print(f"Error: {e}") # 实际上可以通过特定的方式访问到被改写的变量 print(base_instance._BaseClass__mangled_variable) # 输出 Mangled Variable ``` #### 特殊方法 `__method__` 对于前后都带有下划线的形式(如 `__object__`),这类标识符被称为魔术方法或者是特殊方法。它们是由 Python 自身使用的,用来实现某些内置功能或是操作符重载等功能。例如: - `__init__`: 构造函数,在创建新实例时自动调用。 - `__str__`: 返回对象的字符串表示形式,用于打印输出。 ```python class MyClass: def __init__(self, value): self.value = value def __str__(self): return f"MyClass instance with value={self.value}" my_object = MyClass(42) print(my_object) # 使用 __str__() 方法来显示自定义消息 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值