学习python遇到封装问题,求帮助

这个代码为什么可以输出值呢?是封装出错了吗?


class Phone:  #定义一个私有成员和私有成员方法
    __current_voltage= None  #私有成员
    def __keep_single_core(self):  私有成员方法
        print('CPU单核运行')

phone=Phone()
phone._Phone__current_voltage=33
print(phone._Phone__current_voltage)

类的私有类方法和变量都是设置两个下划线,
正常情况下,使用者不知道这个类变量也无法直接访问.

问题是,私有变量是无法被访问的,却又是可变的,
当前第8行代码相当于赋值创建了变量__current_voltage,覆盖了私有变量的保护属性.

python 约定 "" 为保护变量 "__" 为私有变量
但是以上只是约定
并不像C++一样 私有的成员不能被访问到
python的所有成员 都可以被外部访问 和"
" 无关

这段代码中存在一个错误的封装方式,导致可以访问并输出私有成员的值。
在类定义中,私有成员以双下划线开头,但是名称不是以双下划线结尾。这个名称是类名后面跟着双下划线,而不是类名前面跟着双下划线。
因此,在这段代码中,私有成员应该命名为__current_voltage,而不是_Phone__current_voltage。
修改代码如下:

class Phone:  
    __current_voltage = None  
       def __keep_single_core(self):  
        print('CPU单核运行')  
   phone = Phone()  
phone.__current_voltage = 33  
print(phone.__current_voltage)

这样就可以正确地输出私有成员的值了。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/390959
  • 你也可以参考下这篇文章:半路学Python爬虫,学到什么程度可以面试爬虫工程师?
  • 你还可以看下python参考手册中的 python- 错误输出重定向和程序终止
  • 您还可以看一下 阿勒拉哈老师的Python机器学习实战视频教学!课程中的 图片可视化与分类问题描述小节, 巩固相关知识点
  • 除此之外, 这篇博客: 利用python在网上接单赚钱,兼职也能月入过万,还不赶紧学起来中的 有哪些接单的平台? 部分也许能够解决你的问题。
  • 以下回答由chatgpt基于相关博客总结生成:

    这段代码中,print(phone._Phone__current_voltage)会输出33的原因是因为Python中的名称修饰,对于以双下划线__开头的变量,默认会在变量名前面加上类名和一个下划线,即_类名__变量名。这是一种Python的名称修饰规则,目的是为了避免子类意外地重写了父类的属性。

    在这段代码中,__current_voltage是一个以双下划线开头的变量,在类内部被重命名为_Phone__current_voltage。而在代码的最后一行,我们使用phone._Phone__current_voltage来访问这个变量,因此可以得到输出值33。

    为了更好地理解这个问题,可以通过下面的代码进行验证:

    class Phone:
        __current_voltage = None
    
        def __keep_single_core(self):
            print('CPU单核运行')
    
    phone = Phone()
    phone._Phone__current_voltage = 33
    print(phone._Phone__current_voltage)
    print(phone._Phone__keep_single_core())  # 这行代码会报错,提示找不到该方法
    

    在第5行加入了一个不存在的方法__keep_single_core,并通过print(phone._Phone__keep_single_core())来调用。这时会发现会报错,提示找不到该方法。这是因为名称修饰仅对属性起作用,而不会影响方法名。

    因此,问题不是出在封装上,而是由于使用了名称修饰导致的变量名重命名。所以在这个代码中是可以输出值的。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^