1.什么是封装
封装指的是隐藏对象的属性和实现细节,仅对外公开接口,控制程序中属性的访问权限;
python中的权限分为两种
1.公开 外界可以直接访问和修改
2.私有 外界不能直接访问和修改,在当前类中可以直接修改和访问
2.为什么需要封装
一.封装属性
对于属性而言,封装就为了限制属性的访问和修改,其目的是为了保护数据安全
例如:
学生对象拥有,姓名,性别,年龄,和身份证号,分数;其中身份证是一个相对隐私的数据,不应该让外界访问到;
分数属性,是一个非常关键的数据,决定学员能不能正常毕业,不应被随意修改;
二.封装方法
一个大的功能很多情况下是由很多个小功能组合而成的,而这些内部的小功能对于用户而言是没有意义的,所以封装方法的目的是为了隔离复杂度;
例如:
电脑的开机功能,内部需要启动BIOS,读取系统配置,启动硬盘,载入操作系统,等等一系列复杂的操作,但是用户不需要关心这些实现逻辑,只要按下开机键等待开机即可;
3.如何封装
在属性名前添加两个下划线__
,将其设置为私有的
1.封装数据属性实例:网页中折叠
class Student:
def __init__(self,name,gender,age,id,score): # 初始化函数
self.name = name
self.gender = gender
self.age = age
self.__id = id # 将id设置为私有的
self.__score = score # 将score设置为私有的
def test(self):
print(self.__id)
print(self.__score)
stu = Student("Jack","man",20,"320684198901010001",780)
#1.访问私有属性测试
#print(stu.id) # 直接访问到隐私数据
#print(stu.__id) # 换种写法
#以上两行代码均输出相似的错误
#Traceback (most recent call last):
# File "/Users/jerry/PycharmProjects/备课/写课件/test.py", line 102, in <module>
# print(stu.id)
#AttributeError: 'Student' object has no attribute 'id'
#错误含义 在Student类的对象中没有一个id或__id属性
#2.修改私有属性测试
stu.score = 1 # 直接修改私有属性 由于语法特点,相当于给stu对象增加score属性
stu.__score = 2 # 直接修改私有属性 由于语法特点,相当于给stu对象增加__score属性
print(stu.score)
print(stu.__score)
#输出 1
#输出 2
#看起来已经被修改了 调用函数来查看私有属性是否修改成功
stu.test()
#输出 320684198901010001
#输出 780
# 私有的数据没有被修改过
思考:封装可以明确地区分内外,封装的属性可以直接在内部使用,而不能被外部直接使用,然而定义属性的目的终归是要用,外部要想用类隐藏的属性,需要为其提供接口,让外部能够间接地使用到隐藏起来的属性,那这么做的意义何在?
答:可以在接口附加上对该数据操作的限制,以此完成对数据属性操作的严格控制。
class Teacher:
def __init__(self,name,age):
# self.__name=name
# self.__age=age
self.set_info(name,age)
def tell_info(self):
print('姓名:%s,年龄:%s' %(self.__name,self.__age))
def set_info(self,name,age):