考虑如下一个小问题,你就知道类(class)是干嘛用的,为啥抽象成类,如果没有类到底有多烦。

比如我们现在幻想一个小的场景,小岳岳和孙越站在台上说相声,大概的过程是

小岳岳:xxx

孙越:xxx

小岳岳:xxxxxx

。。。。

如果你定义了一个方法,并且以这种形式来描述整个说相声的过程,大概是这样的。

def talk(name,content):

print('%s:%s'%(name,content))

talk('岳云鹏','大家好,我是岳云鹏')

talk('孙越','是了')

talk('岳云鹏','这位是我的师猪,孙越老师')

talk('孙越','我呀?')

如果将相声演员抽象出来一个类呢?

class comedian():

def __init__(self,name):

self.name=name

def talk(self,content):

print('%s : %s'%(self.name,content))

p1=comedian('岳云鹏')

p2=comedian('孙越')

p1.talk('大家好,我是岳云鹏')

p2.talk('是了')

p1.talk('这位是我的师猪,孙越老师')

p2.talk('我呀?')

对于这样一个非常简单的情况,好像并看不出抽象成类到底有什么好的,甚至定义成了类,反而代码更长了。并且从最终的结果来说,都是

所以现在可以理直气壮的说class的出现毫无意义,除了看起来稍微结构分明一点一无是处!不不不,接着看。

如果我希望在名字的后面,加上他在台上的角色呢?比如捧哏,逗哏,现在我需要把上方代码做一些修改。

def talk(name,role,content):

print('%s (%s) : %s'%(name,role,content))

talk('岳云鹏','逗哏','大家好,我是岳云鹏')

talk('孙越','捧哏','是了')

talk('岳云鹏','逗哏','这位是我的师猪,孙越老师')

talk('孙越','捧哏','我呀?')

如果抽象成类呢?(注意看,声明实体的时候增加了角色,talk方法直接调用就可以了没有增加额外的参数)

class comedian():

def __init__(self,name,role):

self.name=name

self.role=role

def talk(self,content):

print('%s (%s) : %s'%(self.name,self.role,content))

p1=comedian('岳云鹏','逗哏')

p2=comedian('孙越','捧哏')

p1.talk('大家好,我是岳云鹏')

p2.talk('是了')

p1.talk('这位是我的师猪,孙越老师')

p2.talk('我呀?')

如果我是甲方爸爸,给了你一份1000句对话的相声台词本,告诉你,“小王,你把这些台词打出来,我想用对话的形式展现一下。”

你使用了第一种抽离方法的形式来实现,废了半天劲打出来给我了。我看了一眼说,“哎呀,你能不能把每个人的角色加在名字后面啊,这样看起来更清晰。”

你知道这意味着什么么?如果你仍然用定义方法的形式来实现,那你现在得加1000份“捧哏逗哏”,而如果你将他们抽象成类了呢?声明实例的时候加个属性就行了。如果你打了1000遍之后发给我,我又提出了新的要求呢?你是不是还要再来1000遍?

很明显的可以发现,对于直接定义方法来说,当参数越来越多的时候,方法就会越来越复杂。最后将乱到你把自己绕进去。稍有改动,伤筋动骨。

但是如果我将可以分组的内容都扎堆放一起,比如把和岳云鹏相关的内容都归到一起,孙越相关的也放在一起,下回调用的时候直接从岳云鹏那一堆数据里拿出来想要的,不就行了么?(这就是类的概念)

我只需要在定义的时候说明岳云鹏是逗哏,以后就不用费劲巴力的每次都再把他的角色说明一次了。

定义类的方法优点就在于此,相关的内容都归到同一个变量下。虽然两个相声演员是同一个类下的不同实例,但是他们之间并不会相互影响。

当然之后你还会接触到什么是继承、多态、封装。对于面向对象编程来说,更加关注的是对象,只要我将每个对象该做的事情,该有的属性设定好,那么在具体执行的时候调用相应方法就够了。

你现在更加接受的叫做面向过程编程,他的关注点在过程上,相对更为直接。这两种方式各有所长也各有所短,比如C语言就是面向过程编程,好处是快,非常快,没有一丝废话,该干嘛就干嘛。缺点就是不容易扩展,不容易维护。

对于面向对象而言,更贴近于人类的思想,把一切事物抽象成一个“对象”,各种操作是基于对象而进行的。扩展性,维护性都相对较高,易于理解。但是缺点就是,慢,生成实例比较浪费资源。

当然我相信你看完我写的这段话也不会有什么感触,因为曾经我在学习编码的初期,也不知道他们是干嘛的。。慢慢的就会有所感悟,不用急,踩坑多了,觉得不方便了,自然就学会了。。。

python 面向对象理解_怎么理解面向对象?相关推荐

  1. java的接口怎么理解_如何理解Java 中的接口

    一.接口(Interface) 在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法.接口并不是类,编写接口的方 ...

  2. 谈谈java面向对象思想_对于Java面向对象思想的理解

    在Java中,除了8种基本数据类型.其他皆为对象! 面向对象主要有 三个基本特征:封装,继承,多态. 封装 主要概念是指:隐藏对象的属性和实现细节,仅对外暴露公共的访问方式.封装是面向对象最基本的特征 ...

  3. 什么是python装饰器_深入理解 Python 装饰器

    作者简介 曾凡伟,携程信息安全部高级安全工程师,2015年加入携程,主要负责安全自动化产品的设计和研发,包括各类扫描器.漏洞管理平台.安全 SaaS 平台等. Python 是一门追求优雅编程的语言, ...

  4. python iterable对象_如何理解Python中的iterable对象

    转载请注明出处:https://www.jianshu.com/u/5e6f798c903a [^*] 表示注脚,在文末可以查看对应连接,但简书不支持该语法. 首先,容器和 iterable 间没有必 ...

  5. python 几何计算_【理解黎曼几何】6. 曲率的计数与计算(Python)

    曲率的独立分量# 黎曼曲率张量是一个非常重要的张量,当且仅当它全部分量为0时,空间才是平直的.它也出现在爱因斯坦的场方程中.总而言之,只要涉及到黎曼几何,黎曼曲率张量就必然是核心内容. 已经看到,黎曼 ...

  6. python参数传递方法_深入理解python中函数传递参数是值传递还是引用传递

    python 的 深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是&q ...

  7. 完全理解python迭代对象_完全理解Python迭代对象、迭代器、生成器

    1.assert:python assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假.可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触 ...

  8. python怎么装饰_如何理解python装饰器

    如何理解装饰器 python 学习遇到的第一个难点是装饰器.装饰器的作用是不大规模改动代码的情况下,增加功能. 作用:为已经存在的对象添加额外的功能 特点:不需要对对象做任何的代码上的变动. 以一个例 ...

  9. python赋值语句对错_深入理解Python中变量赋值的问题

    前言 在Python中变量名规则与其他大多数高级语言一样,都是受C语言影响的,另外变量名是大小写敏感的. Python是动态类型语言,也就是说不需要预先声明变量类型,变量的类型和值在赋值那一刻被初始化 ...

最新文章

  1. 使用remoting远程控制编译机
  2. python print 换行_Python小课堂第21课:规整一下我们的输出之打印格式化与字符串...
  3. 妈妈再也不怕我不会画漂亮的图了!
  4. 分布式事务——TCC 原理
  5. SegmentFault 巨献 1024 程序猿游戏「红岸的呼唤」第一天任务攻略
  6. python颜色列表代码seaborn_在Python中Seaborn – 根据色调名称更改条形颜色
  7. python findall函数_Python正则表达式
  8. android 根据名字获取资源,Android利用资源名称获取其ID(一)—getIdentifier()
  9. 计算机丢失文件无法打开ae,新手AE打开工程文件提示文件丢失解决办法0001.docx...
  10. 微信商家收款码和个人收款码有什么区别?
  11. 推荐一个Firefox的扩展——IE Tab
  12. vmware win7 iso 镜像文件下载
  13. 信息系统项目管理师知识总结
  14. (超详细)大数据Hadoop之HDFS组件
  15. python基础--绘制棋盘图形
  16. Web3.0 · 基础层技术 · SCQA模型趣谈密码学
  17. iOS静态库中打包图片资源
  18. 软件测试课堂笔记之语句覆盖,判定覆盖,条件覆盖,判定/条件覆盖,在eclipse上新建测试用例
  19. 服务器连接盘柜后盘符空间显示不对,服务器连接磁盘阵列柜
  20. IOS (不越狱)网络抓包

热门文章

  1. 智能组卷、专项针对性练习,提高刷题效果!
  2. U3D 游戏引擎之游戏架构脚本该如何来写
  3. linkerd mysql_《Linkerd官方文档》在本地运行Linkerd
  4. 前端:css中的多列的实现与介绍
  5. 【题解】天梯赛练习集 L1-059 敲笨钟
  6. 视频分割算法在移动端如何应用
  7. 用D3.js绘制完整的流程图demo
  8. 一文搞懂蓝绿部署和金丝雀发布
  9. 软件推荐:强力卸载软件HIBIT
  10. 一个程序员的奋斗txt