想记录一下自己学习的过程
这里将记录关于属性私有化
运用场景:
python中属性私有化的运用可以在很多场景中,主要的可分为下面三类:
1.把一个特定的类隐藏起来,不想让外部的类进行直接调用。
2.我想保护这个属性,不想让属性的值随意被改变。
3.保护这个属性,不让派生类【子类】去继承。
实现方法:
在需要私有化的属性名前面加上‘__’,也就是双下划线(两个下划线)
具体演示一下:
下面展示一些 内联代码片
。
// class Person:
def __init__(self):
self.__name = '张三'#加两个下划线,私有化属性
self.age = 18
pass
调用试试:
xz = Person()
print(xz.__name) #在类对象的外部访问
得到的结果是:
AttributeError: 'Person' object has no attribute '__name'
显示了未找到我们已经私有化的属性,当然这是从外部访问。
那再让我们试试从内部访问
def __str__(self):
'''
私有化属性在内部使用
:return:
'''
return '{}的年龄是{}'.format(self.__name,self.age);
这次得到的结果是:
张三的年龄是18
成功了,这说明私有化属性是可以从类的内部访问的,但是不能从类的外部访问。
子类继承与私有化属性
承上,我们在继续看一下子类继承父类是否可以继承私有化属性呢?
直接上代码:
lass Person:
def __init__(self):
self.__name = '张三'#加两个下划线,私有化属性 类外部不能访问,但内部可以访问
self.age = 18
pass
class Studentson(Person):
pass
调用:
stu = Studentson()
print(stu.__hobby)
结果:
AttributeError: 'Studentson' object has no attribute '__hobby'
可以看出,子类无法从父类继承私有化属性。
但是,这时你可会想,这种调用似乎是‘外部调用’,那么从内部呢?
话不多说,直接上代码试一试:
class Studentson(Person):
def printinfo(self):
print(self.name)
pass
#调用
stu = Studentson()
stu.printinfo()
结果:
AttributeError: 'Studentson' object has no attribute 'name'
这时,我们可以确地得出:子类无法继承父类的私有化属性
小结:
1.私有化的【实例】属性不能再从外部访问,可以在类的内部随意调用
2.子类不能继承父类的私有化属性【只能继承父类的公共属性和行为】
3.属性名前加’__‘就可以完成私有化了
ps:顺带提一下,类属性也具有相似的性质,及其私有化也具有以上的特点,大家可以动手试一下。