面向对象(初级篇)

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

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

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

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

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

创建类和对象

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

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

  对象则是根据模板创建的实例,通过实例对象可以执行类中的函数

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

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

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

面向对象三大特性

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

一、封装

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

所以,在使用面向对象的封装特性时,需要:

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

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

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间接获取被封装的内容。

游戏人生程序

1、创建三个游戏人物,分别是:

 

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

 

2、游戏场景,分别:

 

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

 

二、继承

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

例如:

  猫可以:喵喵叫、吃、喝、拉、撒

  狗可以:汪汪叫、吃、喝、拉、撒

如果我们要分别为猫和狗创建一个类,那么就需要为猫和狗实现他们所有的功能,如下所示

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的类如果继承了多个类,那么气寻找方法的方式有两种,分别是:深度优先广度优先

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

三、多态

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

 

总结

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

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

 

posted @ 2018-05-04 16:28  麦兜家的鱼丸  阅读(164)  评论(0编辑  收藏  举报