引言:编程范式
编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很多种不同的方式, 对这些不同的编程方式的特点进行归纳总结得出来的编程方式类别,即为编程范式。 不同的编程范式本质上代表对各种类型的任务采取的不同的解决问题的思路, 大多数语言只支持一种编程范式,当然也有些语言可以同时支持多种编程范式。 两种最重要的编程范式分别是面向过程编程和面向对象编程,当然还有人们常说的函数式编程。
面向过程编程(Procedural Programming)
面向过程编程依赖 , 面向过程又被称为top-down languages, 就是程序从上到下一步步执行,一步步从上到下,从头到尾的解决问题 。基本设计思路就是程序一开始是要着手解决一个大的问题,然后把一个大问题分解成很多个小问题或子过程,这些子过程再执行的过程再继续分解直到小问题足够简单到可以在一个小步骤范围内解决。
面向对象编程(Object-Oriented Programming )
OOP编程是利用“类”和“对象”来创建各种模型来实现对真实世界的描述,使用面向对象编程的原因一方面是因为它可以使程序的维护和扩展变得更简单,并且可以大大提高程序开发效率 ,另外,基于面向对象的程序可以使它人更加容易理解你的代码逻辑,从而使团队开发变得更从容。
面向对象编程几大核心
Class 类
一个类即是对一类拥有相同属性的对象的抽象、蓝图、原型。在类中定义了这些对象的都具备的属性(variables(data))、共同的方法
Object 对象
一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象亦可以有不同的属性,就像人类是指所有人,每个人是指具体的对象,人与人之前有共性,亦有不同
Encapsulation 封装
在类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法
Inheritance 继承
一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承
Polymorphism 多态
多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,指一个基类中派生出了不同的子类,且每个子类在继承了同样的方法名的同时又对父类的方法做了不同的实现,这就是同一种事物表现出的多种形态。
面向对象基础介绍
好了,话不多说,我们先来看一下最简单的定义一个类和使用的方法。
class Person(object): #定义一个类, class是定义类的语法,Person是类名,(object)是新式类的写法。 def __init__(self,name,age,cn='中国'): #构造函数,为你实例化类的对象传参数,类名加括号就会自动执行该方法。 self.name = name self.age = age def talk(self): #定义类的方法,为什么它们都要自动传入一个self?下面我再解释。。。 print('%s is talking'%self.name) def __del__(self): #析构函数,在实例释放、销毁的时候自动执行,通常用于做一些收尾工作,如关闭一些数据库连接,关闭打开的临时文件等等,一般可以不写。 print('结束了') p1 = Person('wusir',22) p1.talk()
那至于为什么会自动传入一个self呢,我们看下面这个图:
根据上图我们得知,其实self,就是实例本身!你实例化时python会自动把这个实例本身通过self参数传进去。
面向对象的三大特性
封装
封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。
封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
继承
面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行继承和扩展。
通过继承创建的新类称为“子类”或“派生类”。被继承的类称为“基类”、“父类”或“超类”。
继承的过程,就是从一般到特殊的过程。
Python2 经典类是按深度优先来继承的,新式类是按广度优先来继承的,
Python3 经典类和新式类都是统一按广度优先来继承的。
OK,那什么是经典类、新式类,什么又是深度优先和广度优先。以后我会慢慢介绍。
多态
Person(object): def __init__(self, name, job): self.name = name self.job = job def whoAmI(self): print('I am a %s, my name is %s' % (self.job,self.name)) class Student(Person): def __init__(self,name,job, gender): super(Student, self).__init__(name,job) self.gender = gender class Teacher(Person): def __init__(self,name,job,gender): super(Teacher, self).__init__(name,job) self.gender = gender def who_am_i(x): x.whoAmI() s = Student('Bob', 'student', '男') t = Teacher('Alice', 'teacher', '女') who_am_i(s) who_am_i(t)
这个代码很好的说明了这三大特性,代码的封装,继承和多态。将功能封装到类里面,同时Student类和Teacher类又继承了Person类的属性与方法,最后调用同样的接口who_am_i,来输出不同的结果。
I am a student, my name is Bob I am a teacher, my name is Alice
这次就先说到这吧,关于面向对象的进阶部分请看下一篇博客。