本文讲述python继承规则。
先来看一些概念:
面向对象的概念
简单地说 面向对象编程(Object Oriented Programming)
简称OOP
就是使我们分析、设计 和实现一个系统的方法尽可能地接近我们认识一个系统的方法。
1、描述对象之间的相互作用 。
2、面向对象的方法包括,面向对象的分析(OOA, Object-Oriented Analysis)
、
面向对象的设计(OOD, Object-Oriented Design)
、面向对象的程序设计(OOP, Object-Oriented Program)
。
3、面向对象技术主要围绕以下几个概念,对象、抽象数据类型、类、类型层次(子类)、继承性、多态性。
对比:
面向过程
过程化设计先确定算法,再确定数据结构;面向过程的程序员习惯于建立数据结构存放数 据并定义方法(函数)来操作数据;
面向对象
面向对象编程先确定数据结构,再确定算法;而面向对象程序员则构造对象模型,将数据 与方法组织在一起。
面向对象程序设计方法的优点 可重用性 可扩展性 可管理性
抽象 :对具体问题(对象)进行概括,抽出这一类对象的 公共性质并加以描述的过程。要求:先注意问题的本质及描述,其次是实现过程或细节。
数据抽象—描述某类对象的属性或状态(对象相互区别的 物理量)
代码抽象—描述某类对象的共有的行为特征或具有的功 能。
类:是描述对象的“基本原型”,它定义一类对象所能拥有的数 据和能完成的操作。
在面向对象的程序设计中,类是程序的基本单元。相似的对象可以归并到同一个类中去,就像传统语言中的 变量与类型关系一样。
从程序设计的角度看,类是面向对象程序中最基本的程序单元,类实质上定义的是一种数 据类型,这种数据类型就是对象类型,我们可以使用类名称来声明对象变量。
对象 :它是具有该类类型的一个特定的个体,是类的一个 变量。
对象的构造过程 :1.为对象开辟空间; 2.调用构造方法初始化; 3.返回对象的引用。
类是对象的模板,同一个类可以创建多个对象,每个对象 有各自的内存空间,不会互相影响
默认情况下,Python中的成员函数和成员变量都是公开的(public)
,在python
中没有类似public,private
等关键词来修 饰成员函数和成员变量。
在python中定义私有变量只需要在变量名或函数名前加 上 ”__“
两个下划线,那么这个函数或变量就是私有的了。
1、_xxx
"单下划线 " 开始的成员变量叫做保护变量,意思是只有类实例和子类实例能访问到这些变量。
2、__xxx
类中的私有变量/方法名 (Python的函数 也是对象,所以成员方法称为成员变量也行得通。), " 双下划线 " 开始的是私有成员,意思是只有类对象自己 能访问,连子类对象也不能访问到这个数据。
3、)__xxx__
系统定义名字,前后均有一个“双下划线” 代表python
里特殊方法专用的标识,如 __init__()
代表 类的构造函数。
封装:行为和属性的结合。
含义:提供将所抽象出的问题的属性(数据成员)和行为 (代码成员)相组合的一种机制,它能将这二类成员再组 合在一起,形成对象或实体。
目的:增强使用的安全性,使用者不必了解具体的实现细 节,而只需要通过设计者提供的外部接口来操作它。 优点:实现高度模块化,从而产生出软件构件(控件); 利用控件快速地组装程序。 客户可以调用一个并不了解内部机制的对象的方法 任何关于内部的改动对客户来说都是隐藏的。
继承:继承是由已有的类创建新类的机制。由继承得到的类称为子类(派生类),被继承的类称为父类 (超类)(基类)。
继承的原则 :
1、子类继承父类的成员变量和成员方法
2、子类不继承父类的构造方法,能够继承父类的析构方法
3、子类不能删除父类的成员,但可以重定义父类成员
4、子类可以增加自己的成员
继承的作用 :
1、实现软件可重用的重要方式
2、增强软件可扩充性
3、提高软件的可维护性
面向对象中的两个重要概念:抽象和分类。
抽象和分类是人们认识世界的基本方法:
抽象是将现实世界中客观存在的事务映射到意识中的一种 方法。
分类是指确定这些抽象到意识中的概念之间的关系。
这些关系的基本形式包括一般到特殊和整体与局部。
在面向对象中,一般到特殊的关系用继承(Inheritance)表 示;整体与局部的关系用组合(composition)表示。(在之前的博客中也将到这个问题)
Super()
用法 :
1、super()
用来引用当前对象的父类,用super()
可以实现对 父类成员的访问。
访问父类被隐藏的成员变量,如: super().variable
2、调用父类中被覆盖的方法,如: super().Method([paramlist])
3、调用父类的构造函数,如: super.__init__([paramlist])
多态 :
一个对象在不同的情况下,具有不同的形态,用于强类型 语言。是使用在继承和接口中实现。
多态:定义时的类型和运行时的类型不一样,此时就成为 多态
python中的多态主要得益于python的鸭子类型,之前的博客中讲过,这里不再多说。
多态的作用: 提高程序的扩展性
实例属性,类属性/方法,静态方法 :
类属性 :直接在类中定义的,与方法平齐,不在方法里的属性就是 类属性
实例属性 :在方法里通过self.属性 都是实例属性 。
类属性就是类对象所拥有的属性,它被所有类对象的实例 对象所共有,在内存中只存在一个副本,这个和C++中类 的静态成员变量有点类似。
对于公有的类属性,在类外可以通过类对象和实例对象访 问。
类方法 :是类对象所拥有的方法,需要用修饰器@classmethod
。
(注解、元数据)来标识其为类方法,对于类方法,第一 个参数必须是类对象,一般以cls
作为第一个参数(当然可 以用其他名称的变量作为其第一个参数,但是大部分人都 习惯以’cls
‘作为第一个参数的名字,就最好用’cls
'了),能 够通过实例对象和类对象去访问。
静态方法 :
需要通过修饰器@staticmethod
来进行修饰,静态方法不 需要多定义参数。
从类方法和实例方法以及静态方法的定义形式就可以看出 来, 类方法的第一个参数是类对象cls
,那么通过cls
引用的必定 是类对象的属性和方法;
而实例方法的第一个参数是实例对象self,那么通过self引 用的可能是类属性、也有可能是实例属性(这个需要具体 分析),不过在存在相同名称的类属性和实例属性的情况 下,实例属性优先级更高。
静态方法中不需要额外定义参数,因此在静态方法中引用 类属性的话,必须通过类对象来引用。
总结 :
方法是代码重用的重要手段,控制好代码被访问的程度 可以加强代码的安全性, 封装、继承和多态是面向对象的基本特征 ,封装特性通过访问权限的设定将类的实现细节隐藏,提供 接口供外部访问 ,继承和组合是类间的基本关系,是软件复用的重要方法 ,多态是面向对象的重要标志。