python 类的简单介绍

概述

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
while  True
     if  cpu利用率 >  90 % :
         #发送邮件提醒
         链接邮箱服务器
         发送邮件
         关闭链接
 
     if  硬盘使用空间 >  90 % :
         #发送邮件提醒
         链接邮箱服务器
         发送邮件
         关闭链接
 
     if  内存占用 >  80 % :
         #发送邮件提醒
         链接邮箱服务器
         发送邮件
         关闭链接

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def  发送邮件(内容)
     #发送邮件提醒
     链接邮箱服务器
     发送邮件
     关闭链接
 
while  True
 
     if  cpu利用率 >  90 % :
         发送邮件( 'CPU报警' )
 
     if  硬盘使用空间 >  90 % :
         发送邮件( '硬盘报警' )
 
     if  内存占用 >  80 % :
         发送邮件( '内存报警'

今天咱们来学习一种新的编程方式:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)
注:Java和C#来讲只支持面向对象编程,而python比较灵活即支持面向对象编程也支持函数式编程编程

建立类和对象

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
# 建立类
class  Foo:
     
     def  Bar( self ):
         print  'Bar'
 
     def  Hello( self , name):
         print  'i am %s'  % name
 
# 根据类Foo建立对象obj
obj  =  Foo()
obj.Bar()             #执行Bar方法
obj.Hello( 'wupeiqi' #执行Hello方法 

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

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

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

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

面向对象三大特性

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

1、封装

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

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

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

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

 self 是一个形式参数,当执行 obj1 = Foo('wupeiqi', 18 ) 时,self 等于 obj1

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

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

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

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

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

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

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

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

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

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

练习一:在终端输出以下信息

  • 小明,10岁,男,上山去砍柴
  • 小明,10岁,男,开车去东北
  • 小明,10岁,男,最爱大保健
  • 老李,90岁,男,上山去砍柴
  • 老李,90岁,男,开车去东北
  • 老李,90岁,男,最爱大保健
  • 老张...
  函数式编程
  面向对象

上述对比能够看出,若是使用函数式编程,须要在每次执行函数时传入相同的参数,若是参数多的话,又须要粘贴复制了...  ;而对于面向对象只须要在建立对象时,将全部须要的参数封装到当前对象中,以后再次使用时,经过self间接去当前对象中取值便可。

 

练习二:游戏人生程序

一、建立三个游戏人物,分别是:

  • 苍井井,女,18,初始战斗力1000
  • 东尼木木,男,20,初始战斗力1800
  • 波多多,女,19,初始战斗力2500

二、游戏场景,分别:

  • 草丛战斗,消耗200战斗力
  • 自我修炼,增加100战斗力
  • 多人游戏,消耗500战斗力
  游戏人生

2、继承

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

例如:

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

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

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

  伪代码

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

  动物:吃、喝、拉、撒

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

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

  伪代码 
  代码实例

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

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

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

相关文章
相关标签/搜索