3. 类的封装

1. 封装Encapsulation

封装是属性和方法的抽象。

  • 属性的抽象:对类的属性(变量)进行定义、隔离和包护
  • 方法的抽象:对类的方法(函数)进行定义、隔离和包护
  • 目标是形成一个类对外可操作属性和方法的接口
graph LR
A((类CLass))-->  B(属性 Attributes)
A --> C(方法 Methods)

属性:

  • 私有属性:只能在类内部访问
  • 公有属性:可以通过类、对象名访问

方法:

  • 公有方法:只能在类内部使用
  • 公开方法:可以通过类、对象名访问

2. 私有类属性和公开类属性

私有属性:仅供当前类访问的类属性,子类也不能访问。

1
2
3
class <类名>:
<__私有类属性名> = <类属性初值>
def __init__(self, [参数列表]):

私有类属性名开始需要有两个下划线__,如 __count

  • 只能在类的内部被方法所访问
  • 不能通过<类名>.<属性名> 或 <对象名>.<属性名>方式访问
  • 有效保证了属性维护的可控性

公开类属性:即类属性

1
2
3
4
class <类名>:
<类属性名> = <类属性初值>
def __init__(self, [参数列表]):
self.<实例属性名> = <实例属性初值>

3. 公开实例属性和私有实例属性

公开实例属性:即实例属性

1
2
3
4
class <类名>:
<类属性名> = <类属性初值>
def __init__(self, [参数列表]):
self.<实例属性名> = <实例属性初值>

私有实例属性:仅供当前类内部访问的实例属性,子类也不能访问

1
2
3
class <类名>:
def __init__(self, [参数列表]):
self.<__实例属性名> = <实例属性初值>

私有实例属性名开始需要有两个下划线__,如__name.

  • 只能在类的内部被方法所访问
  • 不能通过<类名>.<属性名> 或 <对象名>.<属性名>方式访问
  • 有效保证了属性维护的可控性

4.私有方法和公开方法

私有方法

1
2
class <类名>:
def <__方法名>(self, [参数列表]):

私有方法名开始要有2个下划线__,如__getCount().

  • 各类方法都可以通过增加双下划线变为私有方法
  • 私有方法从形式上保护了Python类内部使用的函数逻辑
  • 私有与公有是程序员逻辑,不是安全逻辑,重视约定

5. 类的保留属性和保留方法

保留属性:也叫特殊属性,Special Attributes。

  • 特点:以双下划线开头和结尾。
  • 作用:为理解Python类提供统一的属性接口
  • 属性值:具有特定含义,类定义后直接使用
保留属性 描述
__name__ 类的名称
__qualname__ 以.分隔从模块全局命名空间开始的类名称
__bases__ 类所继承的基类名称
<类>.__dict__ 包含类成员信息的字典,key是属性和方法名称,value是地址
<对象>.__dict__ 包含对象属性信息的字典,key是属性名称,value是值
__class__ 对象所对应的类信息,即type信息
__doc__ 类描述,写在类定义下的首行字符串,不能继承
__module__ 类所在模块的名称

保留方法:

也叫特殊方法,Special Methods

  • 特点:以双下划线开头和结尾。
  • 作用:为操作Python类提供统一的属性接口
  • 方法逻辑:具有特定含义,一般与操作符关联,类定义需要重载。
保留方法 对应操作 描述
obj.__init__() obj=ClasssName() 初始化实例对象的函数逻辑
obj.__del__() del obj 删除实例对象
obj.__repr__() repr(obj) 定义对象可打印字符串的函数逻辑
obj.__str__() str(obj) 定义对象字符串转换操作的逻辑函数
obj.__bytes__() bytes(obj) 定义对象字节串转换操作的函数逻辑
obj.__format__() obj.format() 定义对象格式化输出的函数逻辑
obj.__hash_() hash(obj) 定义对象哈希操作的函数逻辑
obj.__bool__() bool(obj) 定义对象布尔运算的函数逻辑
obj.__len__() len(obj) 定义对象长度操作的函数逻辑
obj.__reversed__() obj.reversed() 定义对象逆序的函数逻辑
obj.__abs__() abs(obj) 定义对象绝对值操作的函数逻辑
obj.__int__() int(obj) 定义对象整数转换的函数逻辑

dir(obj)查看对象所有的属性和方法。

特殊方法