python 面向对象理解_怎么理解面向对象?

本文通过相声演员小岳岳和孙越的例子,解释了面向对象编程中类的概念和优势。对比了直接使用函数与定义类的方式处理对话场景,强调了类在处理复杂性和扩展性需求时的优越性。当需求变化,如添加角色信息,面向对象编程只需在初始化时设置,而面向过程编程则需大量修改。面向对象编程更贴近人类思维,利于扩展和维护,但可能带来性能损失。
摘要由CSDN通过智能技术生成

考虑如下一个小问题,你就知道类(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语言就是面向过程编程,好处是快,非常快,没有一丝废话,该干嘛就干嘛。缺点就是不容易扩展,不容易维护。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值