1. 什么是面向对象封装?
面向对象程序设计(OOP)是一种程序编程模式,其中所有概念都是首先抽象化为其类的概括。然后,通过将公共属性和方法放入类中来扩展这些类。Python同样支持和推崇OOP。而在OOP理念中有一个重要的概念——封装。
封装是面向对象编程的四个特性中的一个,它是将数据和操作数据的方法连接起来,形成一个不可分割的独立单元——即对象,从而保证数据的安全性。在封装过程中,数据被隐藏在对象下面,不能被外部访问,只能通过特定的方法(类的方法)来操作这些数据,确保了数据的完整性和安全性,有效避免了数据被外部随意修改。
2. Python中的封装
2.1 类的定义
在Python中,使用class关键字来定义一个类,而变量则是数据的载体,函数扮演函数处理过程的载体,而类则是面向对象编程的基础,是封装的重点。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def eat(self):
print(f'{self.name} is gorging on some delicious food.')
上述代码中,通过class定义了一个Person类,拥有两个属性:name和age,以及一个方法:eat。
2.2 封装数据
Python中封装数据的实现方式可以使用双下划线(__)将属性私有化,私有化之后的属性只能在类内部使用,外部无法访问。这种方式也叫做Python的名称重整(name mangling),因为双下划线会自动将属性名重命名为_classname__property的形式。
class Person:
def __init__(self, name, age):
self.__name = name
self.__age = age
def eat(self):
print(f'{self.__name} is gorging on some delicious food.')
上述代码中,使用双下划线将属性name和age进行私有化,使其不能被外部访问,只能在类的内部使用。在方法中使用self.__name和self.__age获取这两个属性。
2.3 Getter和Setter方法
在Python中,我们可以通过定义getter方法和setter方法来访问私有化属性或者修改其值。Getter方法可以获取私有化属性的值,而setter方法可以修改私有化属性的值,方法的名字可以自定义,一般是以get_或set_开头。
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 eat(self):
print(f'{self.__name} is gorging on some delicious food.')
上述代码中,定义了get_name和set_name方法,并在init初始化的时候将属性__name进行了私有化后作为私有属性。通过get_name与set_name方法可以进行对私有属性的获取与修改。
2.4 使用@property装饰器
如果在类中使用了大量的getter和setter方法,那么代码的可读性就会减弱,可以使用@property装饰器来简化代码。@property装饰器可以将方法转换为只读属性。
class Person:
def __init__(self, name, age):
self.__name = name
self.__age = age
@property
def name(self):
return self.__name
@name.setter
def name(self, name):
self.__name = name
def eat(self):
print(f'{self.__name} is gorging on some delicious food.')
如上代码所见,可以通过property将方法
name转换为属性,并且在定义setter方法时,通过name.setter来连接setter方法和被@property装饰的属性,使其可以修改属性。
3. 小结
封装是OOP中的重要特性之一,它的主要功能是将数据和数据操作方法组合成一个不可分割的独立单元,从而保证了数据的安全性和完整性。本文介绍了Python中的封装方式,通过类的定义和属性的私有化来完成封装过程,同时为了方便操作,还介绍了getter、setter方法以及@property装饰器等重要知识点,通过对这些知识点的学习,读者可以更好地理解和运用Python的OOP编程。