今天小编给大家分享一下python私有属性和方法怎么获取的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
一般来说,私有属性和方法无法从外部直接获得,也不能继承
注:私有属性和方法就是在前加上两道下划线
举个栗子 -- 私有封装前后对比
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()