python 面向对象详解

2020年05月29日 阅读数:239
这篇文章主要向大家介绍python 面向对象详解,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

Python 面向对象

概述

  • 面向过程:根据业务逻辑从上到下写垒代码
  • 函数式:将某功能代码封装到函数中,往后便无需重复编写,仅调用函数便可
  • 面向对象:对函数进行分类和封装,让开发“更快更好更强…”

面向过程编程最易被初学者接受,其每每用一长段代码来实现指定功能,开发过程当中最多见的操做就是粘贴复制,即:将以前实现的代码块复制到现需功能处。python

随着时间的推移,开始使用了函数式编程,加强代码的重用性和可读性,就变成了这样git

今天咱们来学习一种新的编程方式:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)程序员

建立类和对象

面向对象编程是一种编程方式,此编程方式的落地须要使用 “类” 和 “对象” 来实现,因此,面向对象编程其实就是对 “类” 和 “对象” 的使用。github

类就是一个模板,模板里能够包含多个函数,函数里实现一些功能web

对象则是根据模板建立的实例,经过实例对象能够执行类中的函数271420286872390数据库

  • class是关键字,表示类
  • 建立对象,类名称后加括号便可

ps:类中的函数第一个参数必须是self(详细见:类的三大特性之封装)
   类中定义的函数叫作 “方法”
编程

诶,你在这里是否是有疑问了?使用函数式编程和面向对象编程方式来执行一个“方法”时函数要比面向对象简便服务器

  • 面向对象:【建立对象】【经过对象执行方法】
  • 函数编程:【执行函数】

观察上述对比答案则是确定的,而后并不是绝对,场景的不一样适合其的编程方式也不一样。cookie

总结:函数式的应用场景 –> 各个函数之间是独立且无共用的数据app

面向对象三大特性

面向对象的三大特性是指:封装、继承和多态。

1、封装

封装,顾名思义就是将内容封装到某个地方,之后再去调用被封装在某处的内容。

因此,在使用面向对象的封装特性时,须要:

  • 将内容封装到某处
  • 从某处调用被封装的内容

第一步:将内容封装到某处271641407509817

self 是一个形式参数

当执行 obj1 = Foo(‘wupeiqi’, 18 ) 时,self 等于 obj1

当执行 obj2 = Foo(‘alex’, 78 ) 时,self 等于 obj2

因此,内容其实被封装到了对象 obj1 和 obj2 中,每一个对象中都有 name 和 age 属性,在内存里相似于下图来保存。271653303446704

第二步:从某处调用被封装的内容

调用被封装的内容时,有两种状况:

  • 经过对象直接调用
  • 经过self间接调用

一、经过对象直接调用被封装的内容

上图展现了对象 obj1 和 obj2 在内存中保存的方式,根据保存格式能够如此调用被封装的内容:对象.属性名

二、经过self间接调用被封装的内容

执行类中的方法时,须要经过self间接调用被封装的内容

综上所述,对于面向对象的封装来讲,其实就是使用构造方法将内容封装到 对象 中,而后经过对象直接或者self间接获取被封装的内容。

2、继承

继承,面向对象中的继承和现实生活中的继承相同,即:子能够继承父的内容。

例如:

猫能够:喵喵叫、吃、喝、拉、撒

狗能够:汪汪叫、吃、喝、拉、撒

若是咱们要分别为猫和狗建立一个类,那么就须要为 猫 和 狗 实现他们全部的功能,以下所示:

上述代码不难看出,吃、喝、拉、撒是猫和狗都具备的功能,而咱们却分别的猫和狗的类中编写了两次。若是使用 继承 的思想,以下实现:

动物:吃、喝、拉、撒

猫:喵喵叫(猫继承动物的功能)

狗:汪汪叫(狗继承动物的功能)

因此,对于面向对象的继承来讲,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而没必要一一实现每一个方法。

注:除了子类和父类的称谓,你可能看到过 派生类 和 基类 ,他们与子类和父类只是叫法不一样而已。272229566093488

学习了继承的写法以后,咱们用代码来是上述阿猫阿狗的功能:

那么问题又来了,多继承呢?

  • 是否能够继承多个类
  • 若是继承的多个类每一个类中都定了相同的函数,那么那一个会被使用呢?

一、Python的类能够继承多个类,Java和C#中则只能继承一个类

二、Python的类若是继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先广度优先272315068126604

  • 当类是经典类时,多继承状况下,会按照深度优先方式查找
  • 当类是新式类时,多继承状况下,会按照广度优先方式查找

经典类和新式类,从字面上能够看出一个老一个新,新的必然包含了跟多的功能,也是以后推荐的写法,从写法上区分的话,若是 当前类或者父类继承了object类,那么该类即是新式类,不然即是经典类。272341313127410

272341553282314

经典类:首先去A类中查找,若是A类中没有,则继续去B类中找,若是B类中么有,则继续去D类中找,若是D类中么有,则继续去C类中找,若是仍是未找到,则报错

新式类:首先去A类中查找,若是A类中没有,则继续去B类中找,若是B类中么有,则继续去C类中找,若是C类中么有,则继续去D类中找,若是仍是未找到,则报错

注意:在上述查找过程当中,一旦找到,则寻找过程当即中断,便不会再继续找了

3、多态 

Pyhon不支持多态而且也用不到多态,多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚“鸭子类型”。

总结

以上就是本节对于面向对象初级知识的介绍,总结以下:

  • 面向对象是一种编程方式,此编程方式的实现是基于对  和 对象 的使用
  • 类 是一个模板,模板中包装了多个“函数”供使用
  • 对象,根据模板建立的实例(即:对象),实例用于调用被包装在类中的函数
  • 面向对象三大特性:封装、继承和多态

问答专区

问题一:什么样的代码才是面向对象?

答:从简单来讲,若是程序中的全部功能都是用 类 和 对象 来实现,那么就是面向对象编程了。

问题二:函数式编程 和 面向对象 如何选择?分别在什么状况下使用?