Python 私有变量(__)的访问和赋值以及变量前加(_)

在这里插入图片描述


一、Python 私有变量的访问和赋值

python中的私有变量是以双下划线开头的变量,例如__name。虽然不能直接从外部访问私有变量,但是可以通过一些方式来访问。

一种方式是通过使用变量名改写规则来访问私有变量。Python解释器会将双下划线开头的变量名改写为_类名__变量名的形式。例如,对于类Person中的私有变量__name,可以通过_Person__name来访问。
另一种方式是通过提供公有的getter和setter方法来访问和修改私有变量。通过这种方式,可以在方法内部对私有变量进行操作,同时对外部隐藏实际的变量名。
然而,尽管可以通过上述方式访问私有变量,但是强烈建议不要这样做。因为不同版本的Python解释器可能会将私有变量名改写成不同的形式,这样会导致代码的可移植性和可维护性变差。

案例

class S:
    __name = 'kobe'
    _age = 18

    def __init__(self):
        self.__name1 = 'zhil'
        self.__age1 = 20
        self.__sex='女'

    def get_name(self):
        return self.__name1

    def get_age(self):
        return self.__name1

    def set_age(self, sex):
        self.__sex = sex
s = S()  
# print(s.__name)     #AttributeError: 'S' object has no attribute '__name'
# print(s.__name1)    #AttributeError: 'S' object has no attribute '__name'
print(s._age)  # 18
# print(s.__name1)
print(s.get_name())  # zhil

我们知道,私有变量是不能直接通过:s.__name直接访问滴。而是必须在类内部通过方法返回私有变量。

那么双下划线开头的实例变量是不是一定不能从外部访问呢?也不是。不能直接访问__name是因为Python解释器对外把__name变量改成了_Person__name,
所以,我们仍然可以通过 _person__name 来访问__name变量(注意这里的下划线)

print(s._S__name1)  # zhil

但是我强烈建议大家不要这么做,因为不同版本的Python解释器可能会把__name改成不同的变量名

注意下面的这种错误写法:

s.__sex='男'  #设置__sex属性
print(s.__sex)  	#男
print(s._S__sex)    #女

表面上看,外部代码“成功”地设置了__sex变量,但实际上这个__sex变量和class内部的__sex变量不是一个变量!
内部的__sex变量已经被Python解释器自动改成了_Person__sex,而外部代码是给m实例新增了一个__sex变量。

二、变量前加(_)

私有化属性和方法,类对象和子类可以访问。表面上私有,实际可被外部调用,是一种潜在规则

但为了编程的需要,我们常常需要区分私有方法和共有方法以方便管理和调用。那么在Python中如何做呢?

但为了编程的需要,我们常常需要区分私有方法和共有方法以方便管理和调用。那么在Python中如何做呢?
一般Python约定加了下划线 _ 的属性和方法为私有方法或属性,以提示该属性和方法不应在外部调用,也不会被from ModuleA import *导入。如果真的调用了也不会出错,但不符合规范。

下面的代码演示加了_ 的方法,以及在类外面对其的可访问性。

class Solution:
    def _func(self):
        print('I am a private function.')

    def func(self):
        return self._func()


s = Solution()
s.func()            # I am a private function.
s._func()           # I am a private function.

三、其他

xx:公有变量,所有对象都可以访问;
__xx__:双前后下划线,用于定义类的魔术属性/模法方法,例如: __init__,__str__等,无法直接调用;
xx_:单后置下划线,用于避免与python关键字的冲突。


在这里插入图片描述

  • 30
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码敲到头发茂密

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值