Python 7( 面向对象,实例变量,类,继承,多态 )

本节内容

  • 面向对象编程介绍
  • 为什么用面向对象进行开发
  • 面向对象的特性:封装,继承,多态
  • 类,属性,方法,构造函数,析构函数
  • 类变量,实例变量

面向对象编程介绍

  • 编程范式(面向对象,过程,函数式编程)

面向过程

在这里插入图片描述
在这里插入图片描述
               
面向对象 OOP
在这里插入图片描述

面向对象的几个核心特性

  • Class 类
    一个类 即对一类拥有相同属性的对象的抽象,蓝图,原型。在类中定义了这些对象的都具备的属性(variables(data)),共同的方法。

  • Object 对象
    一个对象即是一个类的实例化后实例,一个类必须经过实例化方可在程序中调用,一个类可以实例化多个对象,每个对象亦可以有不同的属性。

  • Encapsulation 封装
    在类中对数据的赋值,内部调用对外部用户是透明的,这使类变成了一个容器,里面包含着类的数据和方法

  • Inheritance 继承
    一个类可以派生出子类,在这个父类里定义的属性,方法自动被子类继承

  • Polymorphism 多态
    ”一个接口,多种实现“
    一个基类中派生出了不同的子类,且每个子类在继承了同样的方法名的同时又对父类的方法进行了不同的实现,这就是 同一种事物表现出的多种形态。
    Python 7( 面向对象,实例变量,类,继承,多态 )_第1张图片

1 构造函数及其原理

Python 7( 面向对象,实例变量,类,继承,多态 )_第2张图片
Python 7( 面向对象,实例变量,类,继承,多态 )_第3张图片

2 实例变量

Python 7( 面向对象,实例变量,类,继承,多态 )_第4张图片
总结:
变量 就是 静态属性
方法 就是 动态属性

ps:
1 若已经实例化为一个对象之后,去给属性赋值,则结果更新
2 若赋值属性不是类中构造函数的参数 ,赋值之后仍然可以调用
主要 因为 构造函数的原理 传入实例引用 之后属性赋值就相当于具体实例的属性赋值 和原始类无关
Python 7( 面向对象,实例变量,类,继承,多态 )_第5张图片
结果:
Python 7( 面向对象,实例变量,类,继承,多态 )_第6张图片

3 类变量

  • 在 2 的函数中加入类变量
    Python 7( 面向对象,实例变量,类,继承,多态 )_第7张图片
    结果
    Python 7( 面向对象,实例变量,类,继承,多态 )_第8张图片
    总结
    d1 其实相当于新增了一个实例属性 打印时直接打印该值
    d2 打印时发现实例没有此属性 只能找类变量 并输出该值
    当后续更改类变量的值时 d1 没有影响 d2 随之改变

  • 同理,加入类变量 n_list
    在这里插入图片描述
    Python 7( 面向对象,实例变量,类,继承,多态 )_第9张图片
    结果
    在这里插入图片描述
    总结
    发现这两个调用的是一个list 因为留存的是地址 指向原有的list

4 析构函数

在实例释放,销毁的时候自动执行的,通常用于做一些收尾工作,如关闭一些数据库连接,打开的临时文件

  • 生成两个对象 执行各自程序之后 删除
    Python 7( 面向对象,实例变量,类,继承,多态 )_第10张图片
    结果
    Python 7( 面向对象,实例变量,类,继承,多态 )_第11张图片

  • 生成两个对象 执行完一个对象之后立即del
    Python 7( 面向对象,实例变量,类,继承,多态 )_第12张图片
    结果
    Python 7( 面向对象,实例变量,类,继承,多态 )_第13张图片
    总结
    实例对象不主动删除则仍然存在
    默认是执行完程序之后析构函数自动删除
    若想早些删除 则del +对象名

5 私有方法/属性

  • 私有属性 变量名前加__ (两个_)
    Python 7( 面向对象,实例变量,类,继承,多态 )_第14张图片

  • 在公开方法内部调用私有属性 ok
    在这里插入图片描述

  • 若不通过方法,直接想要打印私有属性 not ok
    在这里插入图片描述
    结果
    Python 7( 面向对象,实例变量,类,继承,多态 )_第15张图片

  • 私有方法 方法名前加__ (两个_)
    在这里插入图片描述
    结果 not ok
    Python 7( 面向对象,实例变量,类,继承,多态 )_第16张图片

5 类的继承

  • 常规示例
    Python 7( 面向对象,实例变量,类,继承,多态 )_第17张图片
    Python 7( 面向对象,实例变量,类,继承,多态 )_第18张图片
    结果
    Python 7( 面向对象,实例变量,类,继承,多态 )_第19张图片

  • 更高级的写法
    super( 子类,self).init(在父类初始化函数中的参数)
    Python 7( 面向对象,实例变量,类,继承,多态 )_第20张图片
    用super()的好处在于一旦父类名改变,用到父类的子类方法无需随之更新,便于代码的修改和维护

  • 多继承
    子类
    Python 7( 面向对象,实例变量,类,继承,多态 )_第21张图片
    两个父类
    Python 7( 面向对象,实例变量,类,继承,多态 )_第22张图片
    执行1
    在这里插入图片描述
    结果1
    在这里插入图片描述
    总结
    多继承 先继承左边的 再右边

  • 经典类和新式类的继承顺序
    以A,B,C,D为例:
    Python 7( 面向对象,实例变量,类,继承,多态 )_第23张图片
    Python 7( 面向对象,实例变量,类,继承,多态 )_第24张图片
    结果
    D 有自己的def init(self) 则执行
    若无 则先左边的初始化函数------左无-------右边的初始化----均无----往上一层的类的初始化函数
    D—>B---->C---->A
    这一规律也称为 “广度优先”原则
    总结
    而在python 2中经典类 class X: 是“深度优先”原则
    在此例中应该为 D—>B---->A
    新式类 class XXX(object): 按照“广度优先”原则
    D---->B----->C----->A
    在python 3中均是广度优先原则

  • 多继承实例(学校,学校的人)
    建立四个类
    Python 7( 面向对象,实例变量,类,继承,多态 )_第25张图片
    Python 7( 面向对象,实例变量,类,继承,多态 )_第26张图片
    Python 7( 面向对象,实例变量,类,继承,多态 )_第27张图片
    Python 7( 面向对象,实例变量,类,继承,多态 )_第28张图片
    测试
    Python 7( 面向对象,实例变量,类,继承,多态 )_第29张图片
    结果
    Python 7( 面向对象,实例变量,类,继承,多态 )_第30张图片

  • 阶段性总结

  • 继承:
    可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展

  • 实现继承:
    通过“继承”Inheritance 和“组合”Composition 来实现

  • 继承概念的实现方式有3类
    实现继承 使用基类的属性和方法而无需额外编码的能力
    接口继承 仅使用属性和方法的名称,但是子类必须提供实现的能力
    可视继承 子窗体(类)使用基窗体(类)的外观和实现代码的能力

  • OOP开发范式
    划分对象—>抽象类---->将类组织成为层次化结构(继承和合成)—>用类与实例进行设计与实现几个阶段

6 多态

  • 一个接口 多种实现

  • 定义:
    多态性是 允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给他的子对象的特性以不同的方式运作。简洁说,允许将子类类型的指针赋值给父类类型的指针。

  • 作用:
    封装可以隐藏实现细节,使得代码模块化
    继承可以扩展已存在的代码模块
    以上两者目的都是为了-----代码重用
    多态----实现另一个目的----接口重用
    作用:为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一个属性时的正确调用。

  • 例子
    Python 7( 面向对象,实例变量,类,继承,多态 )_第31张图片
    Python 7( 面向对象,实例变量,类,继承,多态 )_第32张图片
    Python 7( 面向对象,实例变量,类,继承,多态 )_第33张图片

你可能感兴趣的:(----Python,Python,面向对象,类的继承,类的多态,实例变量)