python 面向对象理解_怎么理解面向对象?
考虑如下一个小问题,你就知道类(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 面向对象理解_怎么理解面向对象?相关推荐
- java的接口怎么理解_如何理解Java 中的接口
一.接口(Interface) 在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法.接口并不是类,编写接口的方 ...
- 谈谈java面向对象思想_对于Java面向对象思想的理解
在Java中,除了8种基本数据类型.其他皆为对象! 面向对象主要有 三个基本特征:封装,继承,多态. 封装 主要概念是指:隐藏对象的属性和实现细节,仅对外暴露公共的访问方式.封装是面向对象最基本的特征 ...
- 什么是python装饰器_深入理解 Python 装饰器
作者简介 曾凡伟,携程信息安全部高级安全工程师,2015年加入携程,主要负责安全自动化产品的设计和研发,包括各类扫描器.漏洞管理平台.安全 SaaS 平台等. Python 是一门追求优雅编程的语言, ...
- python iterable对象_如何理解Python中的iterable对象
转载请注明出处:https://www.jianshu.com/u/5e6f798c903a [^*] 表示注脚,在文末可以查看对应连接,但简书不支持该语法. 首先,容器和 iterable 间没有必 ...
- python 几何计算_【理解黎曼几何】6. 曲率的计数与计算(Python)
曲率的独立分量# 黎曼曲率张量是一个非常重要的张量,当且仅当它全部分量为0时,空间才是平直的.它也出现在爱因斯坦的场方程中.总而言之,只要涉及到黎曼几何,黎曼曲率张量就必然是核心内容. 已经看到,黎曼 ...
- python参数传递方法_深入理解python中函数传递参数是值传递还是引用传递
python 的 深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是&q ...
- 完全理解python迭代对象_完全理解Python迭代对象、迭代器、生成器
1.assert:python assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假.可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触 ...
- python怎么装饰_如何理解python装饰器
如何理解装饰器 python 学习遇到的第一个难点是装饰器.装饰器的作用是不大规模改动代码的情况下,增加功能. 作用:为已经存在的对象添加额外的功能 特点:不需要对对象做任何的代码上的变动. 以一个例 ...
- python赋值语句对错_深入理解Python中变量赋值的问题
前言 在Python中变量名规则与其他大多数高级语言一样,都是受C语言影响的,另外变量名是大小写敏感的. Python是动态类型语言,也就是说不需要预先声明变量类型,变量的类型和值在赋值那一刻被初始化 ...
最新文章
- 使用remoting远程控制编译机
- python print 换行_Python小课堂第21课:规整一下我们的输出之打印格式化与字符串...
- 妈妈再也不怕我不会画漂亮的图了!
- 分布式事务——TCC 原理
- SegmentFault 巨献 1024 程序猿游戏「红岸的呼唤」第一天任务攻略
- python颜色列表代码seaborn_在Python中Seaborn – 根据色调名称更改条形颜色
- python findall函数_Python正则表达式
- android 根据名字获取资源,Android利用资源名称获取其ID(一)—getIdentifier()
- 计算机丢失文件无法打开ae,新手AE打开工程文件提示文件丢失解决办法0001.docx...
- 微信商家收款码和个人收款码有什么区别?
- 推荐一个Firefox的扩展——IE Tab
- vmware win7 iso 镜像文件下载
- 信息系统项目管理师知识总结
- (超详细)大数据Hadoop之HDFS组件
- python基础--绘制棋盘图形
- Web3.0 · 基础层技术 · SCQA模型趣谈密码学
- iOS静态库中打包图片资源
- 软件测试课堂笔记之语句覆盖,判定覆盖,条件覆盖,判定/条件覆盖,在eclipse上新建测试用例
- 服务器连接盘柜后盘符空间显示不对,服务器连接磁盘阵列柜
- IOS (不越狱)网络抓包