如何理解“面向对象”编程思想

理解面向对象,首先理解要它的基础概念:程序员

面向对象是将现实问题构建关系,而后抽象成 类 ( class ) ,给类定义属性和方法后,再将类实例化成 实例 ( instance ) ,经过访问实例的属性和调用方法来进行使用。编程

在不一样的语言中,对象的定义范围不一样。在 Python 中 类 和 类的实例 都称为 对象 ( Object ),由于 Python 的类是更顶级的 type 实例化后的对象;而在 Java 等静态语言中,通常把类的实例称为对象。微信

 

理解了理论知识后,接着经过例子,再理解面向对象的三大特征:封装、继承、多态。app

下边咱们把女娲造人的神话故事用面向对象来叙述一遍:dom

假设咱们是女娲(程序设计者),咱们忽然有个想法,想造一群和本身差很少的小人,小人须要有男女两种性别,外观和行为也有一些差别。那首先咱们分析出,无论什么性别,都应该有四肢,因此咱们先仿照本身的构造,在脑海中构思泥人的样子(抽象成基类),而后先赋予泥人一些共有的行为(定义类的实例方法):函数

class Human(object):

    def __init__(self, name='泥人'):
        // 有个名字,有两只手,两条腿
        self.name = name
        self.hands = 2
        self.legs = 2

    def introduce_self(self):
        // 介绍本身
        print('我是%s' % self.name)

而后咱们先捏3个泥人,并给他们取了不一样的名字:spa

>>> a = Human('大强子')
>>> b = Human('二狗子')
>>> c = Human('三愣子')

咱们让其中一我的介绍本身:设计

>>> a.introduce_self()
我是大强子

而后咱们继续完成想法,须要给泥人增长两种性别,而且异性之间能结婚,咱们开始在刚才泥人模型的基础上(继承于基类),构思出两种性别的泥人的区别(设置不一样的属性),而后让他们均可以工做,但工做的内容不同(调用相同的方法出现不一样结果,是多态性),并决定让男人能够娶女人(将这个行为定义为男人的方法)。code

import random

class Female(Human):

    def __init__(self, name):
        // 调用父类的初始化方法,依然有名字、两只手、两条腿
        super().__init__(name)
        // 头发和力量进行随机取值
        self.hair = random.randint(3, 5)
        self.power = random.randint(1, 3)
        // 是否已婚
        self.married = False

    def work():
        print('%s采摘了一些果子' % self.name)

class Male(Human):

    def __init__(self, name):
        super().__init__(name)
        self.hair = random.randint(0, 2)
        self.power = random.randint(2, 5)
        self.married = False

    def work():
        print('%s出去打猎了一天' % self.name)

    def marry(self, other):
        // 判断本身或对方是否已结婚,不然抛出异常
        if self.married is True or other.married is True:
            raise ValueError('法律不支持屡次结婚')
        // 判断对方是不是女性,不然抛出异常
        if instance(other, Female):
            self.married = True
            other.married = True
        else:
            raise TypeError('法律不支持同性结婚')

而后咱们就可让小人活动起来:对象

>>> a = Male('大强子')
>>> b = Male('二狗子')
>>> c = Female('翠花')
>>> for h in [a, b, c]:
...     // 调用父类的方法
...     h.introduce_self()
我是大强子
我是二狗子
我是翠花
>>> for h in [a, b, c]:
...     // 多态性使相同的方法产生不一样的结果
...     h.work()
大强子出去打猎了一天
二狗子出去打猎了一天
翠花采摘了一些果子
>>> a.marry(c)
>>> a.married
True
>>> c.married
True
>>> b.marry(c)
ValueError: 法律不支持屡次结婚
>>> b.marry(a)
TypeError: 法律不支持同性结婚

 

看到这里你应该会发现,面向对象是更接近人类思惟模式的编程思想,在这种能够具象化的需求中,能够极大简化其中的逻辑,让咱们关注于设计对象的属性和方法。

虽然你确实能够经过写一长串函数来达到一样的效果,那实际是另外一种编程思想:面向过程,经过函数实现过程当中一系列的功能,最后按顺序组合后达成需求。

这并非面向过程弱于面向对象,而是在不一样的需求中要选择最合适的设计思路,好比在设计顺序执行的脚本中,明显面向过程的设计思路是更加适合,若是咱们还去定义类就有些累赘了。

这也是题主提出的疑问,正是由于没有遇到适合面向对象的需求。

若是是拥有复杂关系的需求,咱们就应该尽量将互相有关联的行为抽象成类,好比每个网页,网页中每个组件 等等。实际上面向对象帮助咱们在十万行代码的大型项目中,仍然能够游刃有余,正由于如此,才能发展为目前应用最为普遍的编程思想。

 


 

最后,不论是面向什么编程,终究仍是要面向人生

欢迎关注个人微信公众号:面向人生编程

不管什么样的编程思想,都不应只存留在代码之中,更应伴随于整我的生旅途,这个公众号不仅聊技术,还会聊产品/互联网/经济学等普遍话题,因此也欢迎非程序员关注。

相关文章
相关标签/搜索