python面向对象学习笔记10 - 封装与继承

封装

对外隐藏内部实现细节, 外界调用只需要关注接口
目的

  • 方便调用
  • 提高数据安全性
  • 利于代码维护

继承

名称术语
父类, 超类, 基类
子类, 派生类
继承关系, 是资源重用, 包括属性和方法

注意type和object的关系
(1) 元类type继承自object
(2) 而object是type的子类

class A:
	pass

print(A.__class__)
print(object.__class__)
print(type.__bases__)

# <class 'type'>
# <class 'type'>
# (<class 'object'>,)
单继承

多个类继承一个类

class A:
	pass

class C(A):
	pass

print(C.__bases__) # 打印C的父类列表

继承的属性, 方法除了私有的属性和方法, 均可用
继承的属性和方法均为类所有, 如果多个实例操作类的属性, 会相互影响
子类新增属性, 优先独立于父类, 并且属性的访问优先级高于父类

多继承

一个类继承多个类

class A:
	pass

class B:
	pass

class C(A, B):
	pass

print(C.__bases__) # 打印C的父类列表
单多继承比较

在这里插入图片描述

不同继承形态的资源优先级均有差异
单继承链是顺序查找所需资源, A → B → C
无重叠多继承链深度优先查找, 单链查找到最后一个类, 没有所需资源, 再找另一条链, A → B → D → C → E
重叠多继承链广度优先查找, 同深度类顺序查找, 没有所需资源再找更深度的类, A → B → C → D
在这里插入图片描述

每个版本的python的继承链的算法有差异, python2.2之前, python2.2 ~ 2.7, python2.7 ~ python3每个版本都在优化继承链的算法, 过程比较复杂, 主要是深度, 广度, 到C3算法, 这里暂且略过, 主要目的是通过继承链算法判断继承关系是否正确, 比如下图, A → B的继承是多余的
在这里插入图片描述
python3.x版本:
MRO原则
统一为新式类
C3算法

查找继承链顺序/资源查找顺序

import inspect

print(inspect.mro(Class))

资源查找顺序决定继承属性和方法的优先级, 更接近子类的父类的属性与方法优先级更高, 并且高优先级的类重写属性和方法会覆盖低优先级类, 为了调用低优先级类的方法, 可以使用super, 取MRO链条上一个节点类的资源, 不要想当然认为是取父类的资源, MRO链条的上一个节点类未必是父类, 因为python是允许多继承的, 并不是单链

super(para1 [,para2])

def super(cls, inst):
	mro = inst.__class__.mro()
	return mro[mro.index(cls) + 1]

以菱形继承链作为例子, 打印结果为DCBA, A的super为B, B为C, C为D

在这里插入图片描述

class D(object):
	def __init__(self):
		print("D")
	
class C(D):
	def __init__(self):
		super().__init__()
		print("C")

class B(D):
	def __init__(self):
		super().__init__()
		print("B")

class A(B, C):
	def __init__(self):
		super().__init__()
		print("A")
a = A()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值