面向对象(初级篇)

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

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

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

今天要学习的是一种新的编程方式:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)函数式编程

注意:Java和C#来讲只支持面向对象编程,而python比较灵活即支持面向对象编程也支持函数式编程函数

建立类和对象

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

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

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

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

注意:类中函数第一个参数必须是self,类中定义的函数叫作“方法”对象

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

面向对象三大特性继承

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

1、封装

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

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

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

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

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

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

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

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

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

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

1.经过对象直接调用被封装的内容

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

2.经过self间接调用被封装的内容

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

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

游戏人生程序

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

 

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

 

二、游戏场景,分别:

 

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

 

2、继承

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

例如:

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

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

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

class 猫: def 喵喵叫(self): print '喵喵叫' def 吃(self): # do something def 喝(self): # do something def 拉(self): # do something def 撒(self): # do something class 狗: def 汪汪叫(self): print '喵喵叫' def 吃(self): # do something def 喝(self): # do something def 拉(self): # do something def 撒(self): # do something
上述代码不难看出,吃、喝、拉、撒是猫和狗都具备的功能,而咱们却分别对猫和狗的类中编写了两次。若是使用继承的思想,以下实现:
  动物:吃、喝、拉、撒
    猫:喵喵叫(猫继承动物的功能)
    狗:汪汪叫(狗继承动物的功能)
代码:class Animal:

    def eat(self):
        print "%s 吃 " %self.name

    def drink(self):
        print "%s 喝 " %self.name

    def shit(self):
        print "%s 拉 " %self.name

    def pee(self):
        print "%s 撒 " %self.name


class Cat(Animal):

    def __init__(self, name):
        self.name = name
        self.breed = '猫'

    def cry(self):
        print '喵喵叫'

class Dog(Animal):
    
    def __init__(self, name):
        self.name = name
        self.breed = '狗'
        
    def cry(self):
        print '汪汪叫'
        

# ######### 执行 #########

c1 = Cat('小白家的小黑猫')
c1.eat()

c2 = Cat('小黑的小白猫')
c2.drink()

d1 = Dog('胖子家的小瘦狗')
d1.eat()
因此,对于面向对象的继承来讲,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而没必要一一实现每一个方法。
注:除了子类和父类的称谓,你可能看到过 派生类 和 基类 ,他们与子类和父类只是叫法不一样而已。

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

1.python的类能够继承多个类,Java和C#中则只能继承一个类

2.python的类若是继承了多个类,那么气寻找方法的方式有两种,分别是:深度优先广度优先

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

3、多态

python不支持Java和C#这一类强类型语言中多态的写法,可是原生多态,其python崇尚“鸭子类型”

 

总结

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

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