我想你一定知道这个小品:问把大象装冰箱需要几步?

1、打开冰箱门

2、把大象装进冰箱

3、关上冰箱门

对应的python代码:

def open_ref(ref):   print("打开冰箱")

def ref_ele(ele):   print("大象进冰箱")

def close_ref(ref):   print("关上冰箱")

ref = "冰箱"ele = "大象"

# 第一步:打开冰箱open_ref(ref)

# 第二步:把大象放进冰箱ref_ele(ele)

# 第三步:关上冰箱close_ref(ref)

在编程中,这种注重过程的思想,就是面向过程

当解决问题的时候,把事情拆分成:一个个函数 ,然后按照一定的顺序,执行完这些函数,事情就搞定了。

那么,面向对象又是什么?

面向对象会把事物抽象成对象的概念,就是说这个问题里面有哪些对象(冰箱、大象),然后让每个对象去执行自己的方法,问题得到解决。

对于开篇的问题,面向对象是怎么解决的呢?

创建两个类:大象类和冰箱类。

冰箱.开门

大象.进冰箱

冰箱.关门

# 定义大象类class Ele(object):    def __init__(self, name):        self.name = name

    def ref_ele(self):        print("大象进冰箱")

# 定义冰箱类class Ref(object):    def __init__(self, name):        self.name = name

    def open_ref(self):        print("打开冰箱")

    def close_ref(self):        print("关上冰箱")

ref = Ref('美的')ele = Ele('可爱象')

ref.open_ref()ele.ref_ele()ref.close_ref()

两者的区别与联系

在网上,有一个蛋炒饭和盖浇饭的例子,很生动。

https://zhuanlan.zhihu.com/p/75265007

总的来说,面向过程注重的是步骤,如果需求复杂,“饭”、“菜”搅拌在一起,代码会变得很复杂;

面向对象注重的是对象和职责,“饭”、“菜”分离,不同的对象承担不同的职责,更加适合应对复杂的需求变化。


我们之前写的一些小脚本,实现的一些小功能,大都是面向过程的;接下来,要好好聊一聊面向对象了。

首先,先来了解一下“类”的概念,所谓“类”就是一群具有相同特征或者行为的事物的一个统称,比如“人类”、“猫类”,是抽象的。

那么,“对象”就是一个具体的你、我、他,或者我家那只走丢的猫。

也就是说,“对象”是由类创建出来的,如果说“对象”是一架飞机,那么,“类”就是制造飞机前绘制的模型图。

有了这些概念之后,让我们通过一个例子,来认识一下面向对象的三大特性:封装、继承和多态。

先来看一下实现需求。

一共有三个类,分别是“人类”、“猫类”和“哆啦A梦类”;

“猫类”有一个名字属性,和一个玩游戏的方法;“哆啦A梦类”继承自“猫类”;“人类”有一个和“猫类”或者“哆啦A梦类”玩耍的方法。

1)在 Cat类中封装name属性和game()方法,普通猫只是简单的玩耍。

2)定义DuoLaACat继承自Cat,并且重写game(),哆啦A梦需要和大熊玩耍。

3)定义 Person 类,并且封装一个和猫玩的方法,在方法内部,直接让猫对象调用game()

1、封装

根据职责,将“属性 ”和“ 方法”封装到一个抽象的类中,我的理解就是:隐藏一切可以隐藏的实现细节,只向外界提供简单的编程接口。

本例中,Cat的属性就是name(名字),方法就是game(),普通的玩耍。

通过Cat类创建的对象jumao=Cat("橘猫"),就可以使用game()方法。外界是不需要知道game()方法的具体实现的,相当于提供了一个调用的接口。

2、继承

实现代码的重用,相同的代码不需要重复的编写。子类针对自己特有的需求,编写特定的代码。

本例中,DuoLaACat继承自Cat,并且重写game()方法,不再是普通的玩耍,因为哆啦A梦需要和大熊玩耍(自己特有的需求)。

3、多态

不同的子类对象调用相同的父类方法,产生不同的执行结果。以继承和重写父类方法为前提,增加代码的灵活度。

本例中,用Person类创建的xiaoming对象,在和橘猫玩的时候,与和哆啦A梦玩的时候,会有不一样的执行结果。

相关的细节都可以在源码中看到:

# 1、普通猫,封装class Cat(object):    def __init__(self, name):        self.name = name    def game(self):        print("%s 玩毛线..." % self.name)

# 2、哆啦A梦继承自普通猫class DuoLaACat(Cat):    # 多态的体现,重写父类的game()方法    def game(self):        print("%s 和大熊玩..." % self.name)

# 3、人类class Person(object):

    def __init__(self, name):        self.name = name    def game_with_cat(self, cat):        print("%s 和 %s 玩耍..." % (self.name, cat.name))        # 让狗玩耍        cat.game()

# 1. 创建一个猫对象# jumao = Cat("橘猫")duolacat = DuoLaACat("哆啦A猫")

# 2. 创建一个小明对象xiaoming = Person("小明")

# 3. 让小明调用和猫玩的方法xiaoming.game_with_cat(duolacat)

运行结果:小明 和 哆啦A猫 玩耍...哆啦A猫 和大熊玩...

另一种运行结果:小明 和 橘猫 玩耍...橘猫 玩毛线...

本文的主要内容如下:

1)面向过程与面向对象的概念与区别

2)类和对象的关系

3)封装、继承和多态

▼ 点击成为社区注册会员      「在看」一下,一起PY

大象装进冰箱要几步?Python 来解答相关推荐

  1. 把大象装进冰箱要几步?不清楚,但是学会SV验证只剩3步了!

    本文转自:http://www.eetop.cn/blog/html/28/1561828-5940108.html 在上一期的Lab3中,我们创建了TB所需的组件,如Monitor和Checker. ...

  2. SharePoint 2013中的视频体验增强(1)——把大象装进冰箱

    从2010这个版本,SharePoint正式开始了对视频的内置支持,使用silverligth作为其播放器.不过经过某几个项目体验之后,发现2010对视频的内置支持依然是有限的,有些功能需要自己开发来 ...

  3. 浅谈面向对象的编程思想:如何优雅地把大象装进冰箱?

      许多人刚学编程时,想必都听到过这样的话:"*语言是面向对象的,而***语言是面向过程的".那时的新人还懵懵懂懂,就被大牛或者书上的大牛骗去学了一种听起来很厉害的语言,然而学了半 ...

  4. 我是如何把大象装进冰箱里的……

    前几天在知乎看到了这样一个问题:CORNERSTONE等项目管理工具体验如何? 本来利益相关太高不准备答,但是我发现题主问的是CORNERSTONE等项目管理工具体验如何,我个人理解,题主是想问:CO ...

  5. 层次化设计-把大象装进冰箱

    一.概述 在绝大多数的面向对象软件系统设计中,逻辑结构的深度都是非常高的. 现在流行扁平化思维,在各大框架源码中复杂的类关系.执行逻辑关系让我等萌新头皮发麻,我不禁想这些源码为什么不采用扁平化思想进行 ...

  6. Java大象进冰箱线程_把大象装进冰箱:HTTP传输大文件的方法

    上次我们谈到了HTTP报文里的div,知道了HTTP可以传输很多种类的数据,不仅是文本,也能传输图片,音频和视频. 早期互联网上传输的基本上都是只有几k大小的文本和小图片,现在的情况则大有不同.网页里 ...

  7. 看我们如何“把大象放进冰箱里”

    一.数学家的办法 转自MITBBS 把大象放到冰箱里的分析学方法 1)先把大象微分,然后把它放到冰箱里,再在冰箱里把它积分. 2)重新定义冰箱或者大象的测度(如Radon测度). 3)用Banach- ...

  8. C、C++和C#的关系,以“把大象放进冰箱里”举例

    最近得用unity做虚拟仿真相关的东西,当然,它的知名还是在游戏界,像王者荣耀就是使用 unity 开发的. 使用unity就要学习C#语言,我一直以为C#是C++的升级版本,因为C++是C的改进版, ...

  9. 把大象装冰箱,要几个步骤?

    作者:陈老师                               个人公众号:接地气学堂 陈老师新课:商业分析全攻略 https://edu.hellobi.com/course/308 用数 ...

最新文章

  1. js获取验证码倒计时效果
  2. 卡巴斯基:乌云反思 企业安全堪忧
  3. ubuntu系统批量端口永久开放
  4. C语言试题八十三之输出左下三角形九九乘法表
  5. 使用vert.x 2.0,RxJava和mongoDB创建simpe RESTful服务
  6. 土地利用覆被变化的概念_欠压实概念极其荒谬
  7. document.compatMode的CSS1compat
  8. redis中list类型详解及常用命令
  9. 电子邮件系统是如何运作的?
  10. linux没找到unzip命令,linux中提示没有unzip命令解决方法如果你如法使用unzip命令解压.zip文件,可能是你没有安装unzip软件,下面是安装方法命令: yum li...
  11. 【封包技巧】利用wpe来(判断是否是某个特征码封包字节,然后进程修改)
  12. 计算机组成原理第五章----存储器容量的扩展与芯片连接
  13. 3D打印了这个杜邦线理线神器,从此桌面再也不乱了
  14. 尊重钟南山,但请也给我们哀悼科比
  15. rsync和inotify远程同步
  16. 2021爱智先行者—精灵1号的体验分享
  17. 对偶理论,敏感性分析(方述诚 笔记4
  18. 如何在 Java 中实现最小生成树算法
  19. 计算机光驱图标符号,电脑不显示光驱图标怎么解决
  20. WEB超大文件上传与下载

热门文章

  1. (三十三)远期利率协议的结算金、价值与定价
  2. exoplay切换全屏_02.视频播放器整体结构
  3. 腾讯地图 周边 poi 搜索及参数配置
  4. Android开发蓝牙篇之蓝牙设备开启、搜索周边蓝牙设备
  5. 请将磁盘插入“U盘(F)“
  6. 禁用右键 回车 ESC 和 ALT+F4组合建
  7. Ipad开发课程系列目录--很好的教程,推荐给大家
  8. 谈谈企业的数据工作!——企业的数据分析能力金字塔
  9. 最好用的三款电脑端epub阅读器
  10. 批量解压多个rar压缩包并将解压出来的文件以该压缩包的名称重命名