这个代码为什么可以输出值呢?是封装出错了吗?
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)
这样就可以正确地输出私有成员的值了。
不知道你这个问题是否已经解决, 如果还没有解决的话:这段代码中,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())
来调用。这时会发现会报错,提示找不到该方法。这是因为名称修饰仅对属性起作用,而不会影响方法名。
因此,问题不是出在封装上,而是由于使用了名称修饰导致的变量名重命名。所以在这个代码中是可以输出值的。