一般来说,私有属性和方法无法从外部直接获得,也不能继承 注:私有属性和方法就是在前加上两道下划线 举个栗子 -- 私有封装前后对比 class A: # 原属性 aa = 1 # 私有属性 __bb = 2 # 初始
一般来说,私有属性和方法无法从外部直接获得,也不能继承
注:私有属性和方法就是在前加上两道下划线
class A:
# 原属性
aa = 1
# 私有属性
__bb = 2
# 初始化
def __init__(self, num1, num2):
self.num1 = num1
self.num2 = num2
# 普通方法
def get_func(self):
return self.num1
# 私有方法
def __get_num2(self):
return self.num2
obj = A(10, 20)
# 访问公有属性
print(obj.aa)
# 访问私有属性 -- 结果报错
print(obj.bb)
# 访问公有方法
print(obj.get_public_num())
# 访问私有方法 -- 结果报错
print(obj.__get_private_num())
>>>print(obj.aa) # 访问公有属性
>>>1
>>>print(obj.bb) # 访问私有属性 -- 结果报错
>>> AttributeError: 'A' object has no attribute 'bb'
>>># 访问公有方法
>>>10
>>>print(obj.__get_private_num()) # 访问私有方法 -- 结果报错
>>>AttributeError: 'A' object has no attribute '__get_private_num'
可以看到二者的变化,私有属性和方法无法通过原有方法从实例对象处获得
但是你觉得这样就真的安全了吗?
答案是否定的,有一件事我们要明白: ==没有绝对安全的语言==
为什么,让我们换个访问方法访问,来看下面这个例子:
>>> print(obj._A__get_private_num())
>>> 20
结果显示,通过
实例对象._当前类名__属性/方法
的方法我们可以从外部实例对象处获取到私有属性和方法,值得一提的是,即使是继承的子类也是可以的。
这反映出在语言层面来讲没有绝对的安全,只是python的突破方法比较简单而已。但一般设计者往往会在类中添加一些方法来查看和修改私有属性与方法,按照规范,查看私有属性的方法多命名为 get_xx( ), 修改私有属性的方法多命名为 set__xx()