python属性
分为公有属性和私有属性
私有属性
python的私有属性只能在类内部访问,不对外公开
python并没有真正的私有化支持,但可用下划线得到伪私有,有一项大多数 python 代码都遵循的习惯:带有下划线前缀的名称应被视为非公开的 API 的一部分
私有属性定义
以一个_开头或两个_开头
一个_开头的私有属性对外可直接被访问,两个_开头的私有属性对外不可直接访问
class Private(): attr = 1 #公有属性 _attr1 = 2 #单下划线私有属性 __attr2 = 3 #双下划线私有属性 c = Private() print(c.attr) #实例对象可获取公有属性值 1 print(Private.attr) #可通过类获取公有属性值 1 print(c._attr1) #实例对象可获取单下划线私有属性值 2 print(Private._attr1) #可通过类获取单下划线私有属性值 2
print(c.__attr2) # AttributeError: 'Private' object has no attribute '__attr2' 实例对象不可获取双下划线私有属性值 3
print(Private.__attr2) # AttributeError: type object 'Private' has no attribute '__attr2' 不可通过类获取双下划线私有属性值 3
通过访问双下划线私有属性后会报错 :object has no attribute '__attr2',那么真的没有办法去访问私有属性吗?
print(Private.__dict__) # {'__module__': '__main__', 'attr': 1, '_attr1': 2, '_Private__attr2': 3, '__dict__': <attribute '__dict__' of 'Private' objects>, '__weakref__': <attribute '__weakref__' of 'Private' objects>, '__doc__': None}
__dict__
类调用__dict__属性,返回类属性和方法的字典
通过调用类的__dict__属性,发现私有属性__attr2的名称被更改为_Private__attr2且有属性值
调用私有属性
print(c._Private__attr2) #3 print(Private._Private__attr2) #3
通过_Private__attr2发现是可以调用私有属性的,只不过私有属性名称被更改为_类名__私有属性名,之所以说是伪私有属性,其实是 python 做了一次名称更换