python 类的使用(7)之类的私有属性和方法 (类中以单下划线或双下划线开头的变量名或函数名)

在python中有时候会发现别人写的代码中会有一些函数或者变量是以下划线开头的,这些情况又主要出现在类中,其中既有单下划线,也有双下划线,这种以下划线开头的函数或者变量实际上就是代表“私有”的意思,在python中私有变量不需要额外的像其它某些语言中还需要使用private关键词,在python中使用下划线开始命名类中的函数或者变量即可表示私有。那么单下划线和双下划线开头的具体意义以及区别分别是什么呢?若有兴趣请看本文细细为您分析!

附上类使用专栏的其它文章的链接:


以单下划线开头的函数或变量(类中)

以单下划线开头的函数或者变量实际上是伪私有,在类中定义的加单下划线的函数或者属性都是可以被类外部所访问到的。以单下划线开头的函数或变量的意义对我们来说就是虽说其能够被访问,但是最好不要访问(这种伪私有属性或方法的含义就是告诉我们使用这个类的人最好不要直接调用它)。

举个简单的例子:

class Animal:
    _type = 'cute'
    # 定义了一个以单下划线开头的类属性
    def __init__(self):
        self._age = 3
        # 这里也有一个以单下划线开头的类属性
        self.name = 'xiaobai'
    
    def _show_info(self):
    # 定义了一个以单下划线开头的函数
        return self.name, self._age

a = Animal()
print(a._show_info(),a._type, a._age)
# 这里直接调用函数和直接调用两个属性
# 结果:('xiaobai', 3) cute 3
# 可以看到是像普通的属性或方法一样调用就行了

除了上面正常调用外,类的继承时父类的以单下划线开头的属性以及方法也都会被继承。在某些博客中看到说这种命名的方式在使用from m

### 私有方法属性的下划线下划线规则 在 Python 中,私有方法属性可以通过命名约定来实现。以下是关于下划线 `_` 下划线 `__` 的具体规则及其行为: #### 下划线 `_` 下划线通常用于表明某个变量方法是“内部使用”的,这是一种惯例而非强制约束。虽然这种标记不会阻止外部访问这些变量方法,但它向其他发者传达了一个信号:这些内容不应该被直接调用修改。 例如: ```python class SingleUnderscoreExample: def _private_method(self): return "This is a private method" obj = SingleUnderscoreExample() print(obj._private_method()) # 输出: This is a private method ``` 尽管 `_private_method` 被认为是一个“私有方法,但实际上它仍然可以被外部访问[^2]。 --- #### 下划线 `__` 下划线会触发名称改写机制(name mangling),这是 Python 提供的一种保护措施,旨在防止子意外覆盖父中的同名方法属性。通过这种方式,即使存在相同的名字冲突,也可以有效区分不同的成员。 当一个以下划线开头方法属性被定义时,Python 会在运行时将其重命名为似于 `_ClassName__attributeName` 的形式。这使得从外部直接访问变得困难,除非知道确切的改写后的名称。 示例代码如下所示: ```python class DoubleUnderscoreExample: def __init__(self): self.__private_attribute = "This is a private attribute" def __private_method(self): return "This is a private method" obj = DoubleUnderscoreExample() # 尝试直接访问失败 try: print(obj.__private_attribute) except AttributeError as e: print(e) # 属性不存在错误 # 使用名称改写后的方式成功访问 print(obj._DoubleUnderscoreExample__private_attribute) # 输出: This is a private attribute # 同样适用于方法 try: obj.__private_method() except AttributeError as e: print(e) # 方法不存在错误 print(obj._DoubleUnderscoreExample__private_method()) # 输出: This is a private method ``` 上述例子展示了如何利用下划线隐藏对象的状态以及控制对其操作的行为[^4]。 需要注意的是,如果只是想简地标记某些组件为非公共接口而不需要严格的封装,则推荐采用一前置下划线;而对于更严格的数据隔离需求则应考虑应用重前置下划线[^3]。 总结来说,在设计面向对象程序的过程中合理运用这两种风格可以帮助构建更加清晰且健壮的应用结构。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值