考虑如下一个小问题,你就知道类(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语言就是面向过程编程,好处是快,非常快,没有一丝废话,该干嘛就干嘛。缺点就是不容易扩展,不容易维护。
对于面向对象而言,更贴近于人类的思想,把一切事物抽象成一个“对象”,各种操作是基于对象而进行的。扩展性,维护性都相对较高,易于理解。但是缺点就是,慢,生成实例比较浪费资源。
当然我相信你看完我写的这段话也不会有什么感触,因为曾经我在学习编码的初期,也不知道他们是干嘛的。。慢慢的就会有所感悟,不用急,踩坑多了,觉得不方便了,自然就学会了。。。