什么是封装?
封装是OOP(面向对象编程)中的一个重要概念,目的是为了对对象的属性和方法进行访问控制,从而保证程序的安全性和稳定性。封装是OOP中的三大特性之一,另外两个是继承和多态。
封装的作用
封装可以将对象的内部实现隐藏起来,对外表现出一个稳定的接口,从而保证程序的安全性和稳定性。另外,封装可以使代码更加模块化,便于维护和升级。
封装的实现
在Python中,封装通过使用访问控制符来实现。Python中的访问控制符有两种,分别是双下划线“__”和单下划线“_”。其中,双下划线表示私有属性或方法,只能在类内部被访问,而单下划线表示受保护的属性或方法,可以被类及其子类访问,但是不建议在外部直接访问。
如何使用封装?
使用封装只需要定义类和属性/方法,并且使用访问控制符来控制其访问权限即可。下面是一个例子:
class Person:
def __init__(self, name, age):
self.__name = name
self._age = age
def get_name(self):
return self.__name
def set_name(self, name):
self.__name = name
def get_age(self):
return self._age
def set_age(self, age):
self._age = age
在上述代码中,我们定义了一个Person类,其中包括私有属性“__name”和受保护属性“_age”,以及四个方法,分别是构造方法“__init__”、获取名字的方法“get_name”、设置名字的方法“set_name”、获取年龄的方法“get_age”、设置年龄的方法“set_age”。由于“__name”是私有属性,所以只能在类内部使用,当我们想要访问它时,需要使用相应的方法来进行访问。
案例实现
下面我们通过一个案例来演示如何在Python中实现封装。
我们有一个学生类和一个教师类,他们都有姓名和年龄两个属性,同时学生还有学号这个属性,教师还有职称这个属性。现在我们要实现一个简单的程序,能够打印出学生和教师的信息。但是由于学号和职称这两个属性是私有的,所以在打印时不能将它们直接显示出来。
首先,我们定义一个Person类,其中包括姓名和年龄两个属性:
class Person:
def __init__(self, name, age):
self.__name = name
self.__age = age
def get_name(self):
return self.__name
def set_name(self, name):
self.__name = name
def get_age(self):
return self.__age
def set_age(self, age):
self.__age = age
上述代码中,“__name”和“__age”都是私有属性,只能在类内部使用。
接下来,我们定义一个Student类,继承自Person类,同时添加学号这个私有属性:
class Student(Person):
def __init__(self, name, age, number):
super().__init__(name, age)
self.__number = number
def get_info(self):
print("姓名:{},年龄:{},学号:{}".format(self.get_name(), self.get_age(), self.__number))
在上述代码中,我们通过继承Person类来实现学生类,同时添加了一个私有属性“__number”,表示学号。由于“__number”是私有属性,所以不能直接调用,在打印信息时需要使用“get_info”方法来显示信息。
接下来,我们定义一个Teacher类,同样继承自Person类,但是添加的是职称这个私有属性:
class Teacher(Person):
def __init__(self, name, age, title):
super().__init__(name, age)
self.__title = title
def get_info(self):
print("姓名:{},年龄:{},职称:{}".format(self.get_name(), self.get_age(), self.__title))
在上述代码中,我们同样通过继承Person类来实现教师类,但是添加了一个私有属性“__title”,表示职称。
最后,我们编写一个主程序,用来创建学生和教师对象,并打印他们的信息:
def main():
s = Student("张三", 20, "20210001")
s.get_info()
t = Teacher("李四", 35, "副教授")
t.get_info()
if __name__ == '__main__':
main()
在上述程序中,我们分别创建了一个学生对象和一个教师对象,并通过调用他们的“get_info”方法来打印它们的信息。
运行上述程序,我们可以得到如下输出结果:
姓名:张三,年龄:20,学号:20210001
姓名:李四,年龄:35,职称:副教授
从输出结果中可以看出,我们确实实现了封装,因为私有属性“__number”和“__title”并没有被直接打印出来。
总结
封装是OOP中的一个重要概念,可以将对象的内部实现隐藏起来,对外表现出一个稳定的接口,从而保证程序的安全性和稳定性。Python中的封装通过访问控制符来实现,其中双下划线“__”表示私有属性或方法,只能在类内部被访问,而单下划线表示受保护的属性或方法,可以被类及其子类访问,但是不建议在外部直接访问。使用封装时只需要定义类和属性/方法,并且使用访问控制符来控制其访问权限即可。