第7章 面向对象程序设计
- 7.1 面向对象概述
- 7.2 类的定义
- 7.3 类的实例化
- 7.4 访问限制
- 7.5 继承
- 7.6 封装
- 7.7 多态
- 7.8 装饰器
- 7.9 特殊方法
7.6 封装
封装是指将数据与具体操作的实现代码放在某个对象内部,使这些代码的实现细节不被外界发现,外界只能通过接口使用该对象,而不能通过任何形式修改对象内部实现,正是由于封装机制,程序在使用某一对象时不需要关心该对象的数据结构细节及实现操作的方法。使用封装能隐藏对象实现细节,使代码更易维护,同时因为不能直接调用、修改对象内部的私有信息,在一定程度上保证了系统安全性。
对实例属性进行封装,变成私有属性
# 定义一个Person类,两个实例属性,类的实例属性life_val可以在类外部任意被修改
class Person():
def __init__(self, name):
self.name = name
self.life_val = 100 # 实例属性
p1 = Person("John") # 实例化
p1.life_val = 90 # 修改实例属性值
print(p1.life_val)
output:
90
# 把Person类的实例属性名前加双下划线,这一步只是实现私有化了,外部不能访问了,但还没实现封装
class Person():
def __init__(self, name):
self.name = name
self.__life_val = 100 # 实例属性
p1 = Person("John") # 实例化
print(p1.__life_val)
output:
AttributeError: 'Person' object has no attribute '__life_val'
# 外部如果有需要访问呢?类中加方法,这才是封装,封装后外部又可以访问了,但不能任意修改了
class Person():
def __init__(self, name):
self.name = name
self.__life_val = 100 # 实例属性
def get_life_val(self):
return self.__life_val
p1 = Person("John") # 实例化
print(p1.get_life_val())
output:
100
对方法进行封装,变成私有方法
# 方法前加双下划线,变成私有方法,实现封装
class Person():
def __init__(self, name):
self.name = name
self.__life_val = 100 # 实例属性
def __breath(self, name):
print("%s is breathing..."%self.name)
def get_life_val(self):
return self.__life_val
p1 = Person("John") # 实例化
print(p1.get_life_val())
print(p1.breath("John"))
output:
John is breathing...
# 将类中方法私有化,变成只是类中方法可以调用的,方法名前加双下划线
# 外部如果有需要访问呢?类中加方法
class Person():
def __init__(self, name):
self.name = name
self.__life_val = 100 # 实例属性
def __breath(self, name): # 私有方法
print("%s is breathing..." % self.name)
def get_life_val(self):
return self.__life_val
def attack(self, name):
self.__breath(name) # 调用私有方法__breath
p1 = Person("John") # 实例化
p1.attack("John")
output:
John is breathing...