您的“关注”和“点赞”,是信任,是认可,是支持,是动力…
如意见相佐,可留言。
本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新。
文章目录
面向对象编程语言三大特性,如下所示,
- 封装:请参见本文。
- 继承:请参见博文《Python 继承详解》。
- 多态:请参见博文《Python 多态详解》。
1 封装概述
封装(Encapsulation),指的是在设计类时, 将不需要对外提供的内容都隐藏起来,提供公共方法以供外部对其访问。
具体指的是刻意地将一些属性和方法隐藏(私有化)在类的内部,这样在使用此类时,将无法直接以类对象.属性名
、或 类对象.方法名(参数)
的形式调用这些私有属性或私有方法,而只能用未隐藏的公有方法间接操作这些隐藏的私有属性和私有方法。
封装的优点,如下所示:
- 封装保证了类内部数据结构的完整性:封装之后,用户无法直接看到类中的数据结构,只能使用类允许公开的数据(通常指公有方法),很好地避免了外部对内部数据的影响,提高了程序的可维护性。
- 封装数据可以很好的保护隐私。
- 封装方法的主要原因是隔离复杂度。
- 封装提高了代码的复用性。
- 还可以轻松实现避免用户对类中属性和方法的不合理操作:用户只能借助暴露出来的类方法来访问数据,我们只需要在这些暴露的方法中加入适当的控制逻辑,即可轻松实现用户对类中属性或方法的不合理操作。
2 Python 类的简单封装
为了实现 Python 类的封装,Python 采取了下面的方法:
- 公有(共有):默认情况下,类中的变量和方法都是公有的,它们的名称前都没有下划线,公有的变量和方法,在类的外部、类内部以及子类中,都可以正常访问。
- 私有:类中的变量或方法以双下划线
__
开头命名,则该变量或方法为私有的,私有的变量或方法,只能在本类内部使用,类的外部以及子类都无法使用。 - 也有把变量名或方法名以单下划线
_
开头定义的,通常也表示私有的。
举例如下所示:
class Person:
def setName(self, name):
if len(name) <= 0:
raise ValueError('姓名长度要大于 0 。')
self.__name = name
def getName(self):
return self.__name
# 为 name 配置 property() 函数
name = property(getName, setName)
def setAddress(self, address):
if address.startswith("http://"): # 判断网址要是否是 http:// 开头
self.__address = address
else:
raise ValueError('地址必须以 http:// 开头')
def getAddress(self):
return self.__address
# 为 add 配置 property() 函数
address = property(getAddress, setAddress)
# 定义私有展示方法
def __display(self):
print(self.__name, self.__address)
person = Person() # 创建 Person 类的对象
person.name = '码农阿杰'
person.address = 'https://blog.csdn.net/manongajie'
print(person.name)
print(person.address)
运行结果:
码农阿杰
https://blog.csdn.net/manongajie