访问类中私有属性的方式(两种)

本文介绍了Python中访问类私有属性的两种方式,包括单下划线和双下划线的区别。私有属性主要用于限制外部直接访问,但可以通过特定方法间接访问。文章通过代码示例解释了为何直接访问双下划线前缀的私有属性会引发警告,并提供了两种解决方案。

1.首先要理解私有属性:

   私有属性主要是指  Python中单下划线和双下划线的区别  (比较直白的意思是:)

_x: 单前置下划线,私有化属性或方法,from somemoudle import *禁止导入,类对象和子类可以访问

__xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到)

接下来用代码解释:

2.

class People(object):
    def __init__(self):
        self.name = 'zhangsan'
        self._age = '20'
        self.__address = '郑州'


if __name__ == '__main__':
    p = People()
    print(p.name)
    print(p._age)
    print(p.__address)

其实在这里p._age下面有波浪线,p.__address颜色是那种似乎报错的颜色!运行结果:

显然__address这个地方报错了,说明不能使用。

 

### Python 中私有属性定义及用法 在 Python 编程中,封装作为一种重要的面向对象特性,用于限制对内部数据和方法的访问,确保对象的内部状态只能通过特定的方法进行修改[^1]。为了实现这一目标,Python 提供了一种特殊的命名约定——即在成员名称前加双下划线 `__` 来创建所谓的“私有”成员。 #### 定义私有属性 当希望某些属性不被外部直接访问时,可以通过给这些属性的名字前面加上两个下划线来声明它们为私有的: ```python class Person: def __init__(self, name, age): self.__name = name # 私有属性 self.age = age # 公开属性 def get_name(self): return self.__name def set_name(self, new_name): if isinstance(new_name, str): self.__name = new_name else: raise ValueError("Name must be a string.") ``` 在这个例子中,`__name` 是一个私有属性,它不能从的外部直接访问;而 `age` 则是一个公开属性,可以直接读取或更改其值。如果尝试直接访问 `person_instance.__name` 将会抛出 AttributeError 错误。 #### 使用 getter 和 setter 方法操作私有属性 由于无法直接访问私有属性,通常会在内提供公共接口(getter/setter 方法),以便安全地获取或更新私有字段的内容: ```python p = Person('Alice', 30) print(p.get_name()) # 输出 Alice p.set_name('Bob') # 修改名字为 Bob try: p.set_name(123) # 这里将会引发异常因为传入了一个整数而不是字符串 except ValueError as e: print(e) # 下面这行代码会导致错误,因为我们试图直接访问私有变量 # print(p.__name) ``` 需要注意的是,虽然使用了双下划线开头标记为私有,但这并不是绝对的安全措施。实际上,Python 并不会阻止程序员绕过这个保护机制去访问真正的底层存储位置 (例如 `_ClassName__attribute`) ,不过这样做并不推荐,因为它违反了设计意图并且可能破坏程序逻辑的一致性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值