python类的假私有成员变量

本文介绍了Python中如何通过双下划线实现成员变量和方法的私有化,并解释了这种私有化的实质只是名称变更,而非真正的访问限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#前言
Python的类并不使用关键字区分是私有成员和共有成员,但是为啥私有成员变量外面还是访问不到呢?

粗糙的隐藏

普通的python类

class TT:
    def __init__(self,name):
        self.name=name
        self.privateMem=1

t=TT('hah')
print(t.privateMem)

想都不用想会打印出1

因为这个时候privateMem还是个共有 成员,那么怎么变成私有成员呢?

加俩下划线

class TT:
    def __init__(self,name):
        self.name=name
        self.__privateMem=1

t=TT('hah')
print(t.privateMem)

结果就是

Traceback (most recent call last):
  File "/Users/zhangyan/Documents/moklearn/pyHigh/one/demo3.py", line 13, in <module>
    print(t.privateMem)
AttributeError: 'TT' object has no attribute 'privateMem'

提示说找不到这个成员。那么隐藏起来了么?答案是根本没有!表面私有而已。

print(t.__dict__)

看看成员

{'_TT__privateMem': 1, 'name': 'hah'}

WTF ,原来python就是给这个成员换了个名字(privateMem变成了_TT__privateMem ),我的天,这就私有辣?(私有方法也是一样)

class TT:
    def __init__(self,name):
        self.name=name
        self.__privateMem=1

    def __privatefun(self):
        print("private")


t=TT('hah')
print(t._TT__privateMem)
t._TT__privatefun()

这真是一个粗糙的“私有化”

Python 中,的成员变量默认是公开的(public),即外部可以直接访问和修改。为了实现私有成员变量Python 提供了一种命名约定和机制,即通过在变量名前加双下划线 `__` 来定义私有变量。这种变量不能直接从的外部访问,但可以通过的方法间接访问或修改。 例如,以下代码定义了一个 `Base`,其中 `a` 是公开变量,`__c` 是私有变量: ```python class Base: def __init__(self): self.a = "GeeksforGeeks" self.__c = "GeeksforGeeks" ``` 尝试从的外部直接访问私有变量 `__c` 会导致 `AttributeError` 异常: ```python obj1 = Base() print(obj1.a) # 输出: GeeksforGeeks # print(obj1.__c) # 会抛出 AttributeError ``` 私有变量的设计目的是为了限制外部对对象内部状态的直接修改,从而提高封装性和安全性。尽管 Python 并没有严格意义上的私有变量机制,但通过命名约定和访问控制,可以实现似效果。变量名前的双下划线会触发名称改写(name mangling),使变量名在定义中变为 `_名__变量名` 的形式,从而避免与子中的同名变量发生冲突。这也意味着,私有变量仍然可以通过改写后的名称访问,但这通常不被推荐[^4]。 如果需要对私有变量进行受控访问,可以结合 `property` 或 `getter` 和 `setter` 方法来实现。例如: ```python class Person: def __init__(self, age): self.__age = age # 私有变量 @property def age(self): return self.__age @age.setter def age(self, value): if value < 0: raise ValueError("Age cannot be negative") self.__age = value ``` 这样可以确保 `age` 变量只能通过 `setter` 方法被合法修改,而不会被随意赋值。通过这种方式,可以在访问和修改私有变量时添加验证逻辑,增强数据的安全性和一致性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值