私有化属性的概念和意义
含义:修改类属性都是直接通过类名修改的。
如果有些重要属性不想让别人随便修改,
或者防止意外修改,该如何处理?
意义:为了更好的保存属性安全,
即不能随意修改,将属性定义为私有属性
,添加一个可调用的方法去访问。
注意:Python并没有真正的私有化支持,
但是可以通过下划线完成私有的效果,
类属性(方法)和实例属性(方法)遵循相同的规则
添加不同下划线的结果:
x 共有属性 ----不添加任何东西
类内部访问
子类内部访问
模块其他位置访问
类访问---->父类,派生类
实例访问----->父类派生类,派生类实例
跨模块访问
import形式导入
from模块import*形式导入
class Animal:
x = 10
def test(self):
print(Animal.x)
print(self.x )
pass
class Dog(Animal):
def test2(self):
print(Dog.x)
print(self.x)
pass
a = Animal()
d = Dog()
print(Animal.x)
print(Dog.x)
print(a.x)
print(d.x)
#10 都可以访问
#10
#10
#10
_y 受保护属性
类内部访问
子类内部访问
模块其他位置访问
跨模块位置访问
class Anumal:
_y = 10
def test(self):
print(Animal._y)
print(self._y)
pass
class Dog(Animal):
def test2(self):
print(Dog._y)
print(self._y)
pass
a = Animal()
d = Dog()
print(Animal._y)
print(Dog._y)
print(a._y)
print(d._y)
__x
class Anumal:
__x = 10
def test(self):
print(Animal.__x)
print(self.__x)
pass
class Dog(Animal):
def test2(self):
print(Dog.__x)
print(self.__x)
pass
a = Animal()
d = Dog()
#d.test2() 会报错
print(Animal.__x) #报错,不能通过类名访问此处的私有属性
print(Dog.__x)
print(a.__x)
print(d.__x)
名字重整机制
使用私有属性的场景
数据保护
1、把特定的一个属性隐藏起来,不想让外部直接进行调用。
2、想保护这个属性,不想让属性的值随意改变
3、保护这个属性,不想让派生类【子类】去继承。
小结:
1、私有化的【实例】属性,
不能在外部直接的访问,可以在类的内部随意的使用
2、子类不能继承父类的私有化属性【只能继承父类公共的属性和行为】
3、在属性名的前面直接加__就可以变为私有化了。
特性:
1、私有化属性在类外部不可以访问、修改
2、私有化属性在类的内部访问、修改
3、子类不能继承私有化属性