第二十九章、面向对象(高级)
知识点回顾
什么是封装
封装是指将数据(属性)和操作数据的行为(方法)封装在类中,并控制外部对内部数据的访问权限,让用户通过特定的方法才能操作这些对象。
封装的目的
- 隐藏类的内部实现细节,让使用者不用关心这些细节,从而保证数据的安全性。
- 防止外部直接修改对象的内部状态。
- 提供清晰的接口(尽可能少的方法(或属性))供外部使用。
封装的方法
- 无封装,公用属性,任何语句都可以直接属性和方法,如:
class Human:
pass
h1 = Human()
h1.age = 18
- 私有属性和方法封装(以双下划线 __ 开头且不以双下划线 __ 结尾的属性和方法),如:
class Human:
def __init__(self, n, a):
self.__name, self.__age = n, a
h1 = Human()
h1.__age = 18 # 报错
1. __slots__列表
作用:
限定每一个对象只能有固定的属性,防止动态添加属性。
优化内存,提高访问速度。
- 使用列表来保存属性名和属性值,不适用字典
__dict__
保存,节省内存,提高速度。
说明:
__slots__
属性是类属性,他是一个列表,列表的值是字符串(属性名称)。
含有 __slots__
属性的类所创建的实例对象没有 __dict__
属性,即此实例不用字典来存储对象的属性(实例属性) 。
示例
# __slots__ 列表 示例
class Human:
__slots__ = ['name', 'age']
def __init__(self, n, a):
self.name, self.age = n, a
s1 = Human('小张', 18)
s1.score = 100 # 添加额外的属性报错
print(s1.__dict__) # s1也没有 __dict__属性