对于萌新来讲,面向对象,这是一个很陌生的词语。若是你接触过Linux,你必定知道“一切皆文件”,也就是说,在Linux中全部都是文件,鼠标是文件、键盘是文件、目录是文件等等一切都是文件;Python设计时就是一门面向对象的语言,在Python中,秉承“一切皆对象”,也就是说,在Python中见到的一切都是对象。面向对象是一个很抽象的概念,来一点一点剖析它!编程
在编程中,想要实现一样的功能,可能会有好多种编写方法,毕竟条条大路通罗马,随着编写方法的不断聚类,出现了三种主要的程序编程典范,分别是:面向过程编程、函数式编程、面向对象编程。这三种编程典范各有千秋,比较一下便知。小程序
面向过程编程的思想是让程序从头至尾一步步执行,环环相扣。对于小程序和小脚原本说,面向过程是最方便的。可是面向过程也有这致命的缺点,代码的重复利用率极低,假如程序中有十次须要拿到列表里数字元素的最小值,那就要重复编写十次这个代码,很烦对不对,忽然需求变了,不要最小值了,要最大值,那就要更改程序十次,更烦😡编程语言
1 list1 = [1, 2, 3, 4, 5, 6, 7] 2 list2 = [2, 3, 1, 5, 5, 3, 1] 3 list3 = [23, 456, 134, 45] 4 5 max_num = list1[0] 6 for i in list1: 7 if max_num < i: 8 ¦ max_num = i 9 print(max_num) 10 11 12 max_num = list2[0] 13 for i in list2: 14 if max_num < i: 15 ¦ max_num = i 16 print(max_num) 17 18 19 max_num = list3[0] 20 for i in list3: 21 if max_num < i: 22 ¦ max_num = i 23 print(max_num) 24 25 # 能够看到每次都要写一遍代码,重复利用率极低
因而函数便应运而生了,函数的出现大大增长了代码的重复利用率,而且修改起来也特别方便,程序也容易扩展。将上面的需求编写为一个函数便可,每次使用时调用函数便可,当需求变了之后,直接修改函数的代码块就能够解决。这就是函数式编程,听起来超级方即是不是,以上就是函数式编程的优势。函数式编程
1 def maxNum(nums): 2 ''' 3 返回nums中的最大数字 4 ''' 5 max_num = nums[0] 6 for i in nums: 7 ¦ if max_num < i: 8 ¦ ¦ max_num = i 9 print(max_num) 10 11 12 list1 = [1, 2, 3, 4, 5, 6, 7] 13 list2 = [2, 3, 1, 5, 5, 3, 1] 14 list3 = [23, 456, 134, 45] 15 16 maxNum(list1) 17 maxNum(list2) 18 maxNum(list3) 19 20 21 # 使用函数极大的提升了代码的重复利用率
但但但但可是,函数式编程就没有缺点了吗?固然有,要否则就不会出现面向对象编程了。函数
假如如今有三个角色,分别是张3、李4、王二麻子,他们的职业分别是老师、医生、建造师,须要实现的功能是吃饭、说话、教书、治疗、建造。按照函数式编程的思想,这些功能就是函数嘛,搞起:ui
1 def eat(name): 2 pass 3 def talk(name): 4 pass 5 def teach(name): 6 pass 7 def treat(name): 8 pass 9 def build(name): 10 pass 11 12 # 三我的都能吃 13 eat('张三') 14 eat('李四') 15 eat('王二麻子') 16 17 # 三我的都能说话 18 talk('张三') 19 talk('李四') 20 talk('王二麻子') 21 22 # 只有张三能够教书 23 teach('张三') 24 25 # 只有李四能够治疗 26 treat('李四') 27 28 # 只有王二麻子能够建造 29 build('王二麻子')
上面的代码看起来实现了要有的功能,可是有一个致命的问题,那就是张三好像也能够治疗和建造、李四也能够教书和建造、王二麻子也能够教书和治疗,无非不过传递参数的时候换一我的名,这明显是不容许的!要是能够作出限制就行了,教师只能去教书,不能去治疗和建造,这就是面向对象编程的思想。spa
从上图能够看出,对象来自于类,对象能干的事只有类里的方法,如今又稀里糊涂多了一个更加陌生的新名词:类设计
类(class):用来描述属性和方法的集合。code
方法:类中定义的函数对象
对象:类的实例化
「解释」面向对象编程就是物以类聚,人以群分。有一个职业叫作医生(类),这是一个抽象的存在;李四(对象)是一个医生,这是一个具体而真实的存在;由于医生(类)能够吃饭、说话、治疗,不能够教书,那么张三(对象)就能够吃饭、说话、治疗,不能够教书。
这就是面向对象编程,尤为对于游戏开发及其重要,好比英雄联盟,全部英雄均可以使用召唤师技能(点燃、闪现等),不一样英雄又有着各自不一样的技能
Python在设计之初就是一门面向对象编程语言,特色就是:一切皆对象。字符串、列表、字典等这些都是类,每当你建立一个具体的字符串,就至关于类的实例化对象,这个具体的对象就可使用字符串类里的方法,这也就是为何不一样数据类型拥有不一样的方法
In [2]: print(type('')) <class 'str'> In [3]: print(type([])) <class 'list'> In [4]: print(type({})) <class 'dict'> In [5]: print(type(())) <class 'tuple'> # 能够看到这些数据类型都是类
「建立」说了这么多,相信你已经明白了面向对象编程的思想。那么接下来就要开始建立类了。基本语法以下:
class 类名: ''' 类的帮助信息 ''' 类的代码块(能够是语句、函数、类)
能够看到类的定义和函数的定义差很少,举几个例子吧:
class Doctor: ''' 建立一个医生类 ''' def eat(self): ¦ print('我喜欢吃') def talk(self): ¦ print('我喜欢说话') def treat(self): ¦ print('我喜欢治疗病人') class Teacher: ''' 建立一个老师类 ''' def eat(self): ¦ print('我喜欢吃') def talk(self): ¦ print('我喜欢说话') ¦ def teach(self): ¦ print('我喜欢教书')
「实例化」类的实例化其实很简单,只须要 对象 = 类() 便可,举例子:
zhangsan = Teacher() # 将Teacher类实例化为对象张三 lisi = Doctor() # 将Doctor类实例化为对象李四
「属性访问」使用 实例化对象.方法() 便可,例如:
zhangsan.eat()
zhangsan.teach()
lisi.talk()
lisi.treat()
# 运行结果 我喜欢吃 我喜欢教书 我喜欢说话 我喜欢治疗病人
细心的小伙伴已经发现类里的每个函数都有一个默认参数self,这个self是什么呢?咱们先来打印一下看看:
class Teacher: def eat(self): ¦ print(self) # 打印self lisi = Teacher() lisi.eat() # 运行结果 <__main__.Teacher object at 0x1014b12e8>
能够看到self是Teacher object,object的中文意思为对象,也就是说,self是类的实例化对象,也就是lisi。
类中函数的第一个参数是固定表示对象的,与叫什么无关,self是你们约定俗成的叫法而已,换成其余名称也是能够的,好比换成sb
class Teacher: def eat(sb): ¦ print(sb) lisi = Teacher() lisi.eat() # 运行结果: <__main__.Teacher object at 0x104034320>
不是特殊须要尽可能不要改变self的名称啦🐷
关于面向对象第一小节就记录这么多,主要是理解面向对象的思想以及简单类的建立。以后会讲解类的各类变量、类的传参、类的性质、类的各类方法。今天就肝到这里