首页 > 代码库 > Python_oldboy_自动化运维之路_面向对象2(十)
Python_oldboy_自动化运维之路_面向对象2(十)
本节内容:
- 面向对象程序设计的由来
- 什么是面向对象的程序设计及为什么要有它
- 类和对象
- 继承与派生
- 多的态与多态性
- 封装
- 静态方法和类方法
- 面向对象的软件开发
1.面向对象程序设计的由来
见概述:http://www.cnblogs.com/linhaifeng/articles/6428835.html
2.什么是面向对象的程序设计及为什么要有它
面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西。
优点是:极大的降低了程序的复杂度
缺点是:一套流水线或者流程就是用来解决一个问题,生产汽水的流水线无法生产汽车,即便是能,也得是大改,改一个组件,牵一发而动全身。
应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等。
面向对象的程序设计的核心是对象,要理解对象为何物,必须把自己当成上帝,上帝眼里世间存在的万物皆为对象,不存在的也可以创造出来。面向对象的程序设计好比如来设计西游记,如来要解决的问题是把经书传给东土大唐,如来想了想解决这个问题需要四个人:唐僧,沙和尚,猪八戒,孙悟空,每个人都有各自的特征和技能(这就是对象的概念,特征和技能分别对应对象的数据属性和方法属性),然而这并不好玩,于是如来又安排了一群妖魔鬼怪,为了防止师徒四人在取经路上被搞死,又安排了一群神仙保驾护航,这些都是对象。然后取经开始,师徒四人与妖魔鬼怪神仙交互着直到最后取得真经。如来根本不会管师徒四人按照什么流程去取。
面向对象的程序设计的
优点是:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。
缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测最终结果。于是我们经常看到一个游戏人某一参数的修改极有可能导致阴霸的技能出现,一刀砍死3个人,这个游戏就失去平衡。
应用场景:需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方
面向对象的程序设计并不是全部。对于一个软件质量来说,面向对象的程序设计只是用来解决扩展性。
3.类和对象
python中一切皆为对象,且python3统一了类与类型的概念,类型就是类,所以,不管你信不信,你已经使用了很长时间的类了
>>> dict #类型dict就是类dict <class ‘dict‘> >>> d=dict(name=‘lijun‘) #实例化 >>> d {‘name‘: ‘lijun‘} >>> d.pop(‘name‘) #向d发一条消息,执行d的方法pop,相当于调用dict类的一个属性,其中pop这个函数就是删除字典的指定内容并且回显 ‘lijun‘
基于面向对象设计一个款游戏:英雄联盟,每个玩家选一个英雄,每个英雄都有自己的特征和和技能,特征即数据属性,技能即方法属性,特征与技能的结合体就一个对象。
从一组对象中提取相似的部分就是类,类也是特征与技能的结合体,特征即数据并且是所有对象共享的数据,技能即函数属性并且是所有对象共享的函数属性。
garen_hero.Q()称为向garen_hero这个对象发送了一条消息,让他去执行Q这个函数,完成一个功能,类似的有:
garen_hero.W()
garen_hero.E()
garen_hero.R()
一个英雄可以攻击另外一个英雄,这就是对象之间的交互
garen_hero.attack(Riven)
#类有两个功能:实例化和属性引用 class Garen: #lol游戏人物盖伦 camp=‘Demacia‘ #阵营:德玛西亚 def __init__(self,nickname,aggresivity,life_value): #每个玩家都有共同的属性:名字,攻击力,生命值 self.nickname = nickname self.aggresivity = aggresivity self.life_value = life_value def attack(self,enemy): #定义一个攻击的属性 print(‘is attacking....‘,self,enemy) #类的第一个功能:实例化 g1 = Garen(‘草丛伦‘,82,100) #实例化,相当于生成一个游戏玩家 g2 = Garen(‘hahaha‘,12,1020) #类的第二个功能:属性引用,包含数据属性和函数属性 print(Garen.camp) print(Garen.__init__) print(Garen.attack) #对于一个实例来说,只有一种功能:属性引用 print(g1.nickname,g1.aggresivity,g1.life_value) # print(g1.attack,id(g1.attack)) #通过实例来调用类中的函数,根据显示的内容就是绑定方法 print(Garen.attack,id(Garen.attack)) #通过类来调用自己的函数属性 #总结: #对于类来说就是数据(camp)和函数(attack)的结合体 #对于类的数据属性来说,共享给所以实例 #对于类的函数来说,绑定给实例用,绑定了就是为了给实例用的,实例可以传自己的参数 Garen.attack(1,2) g1.attack(‘lijun‘) #相当于:Garen.attack(g1,‘lijun‘) 这就是绑定方法的牛逼用处,自动传值 print(g1.camp,id(g1.camp)) print(g2.camp,id(g2.camp)) print(Garen.camp,id(Garen.camp))
# -*- coding: UTF-8 -*- #blog:http://www.cnblogs.com/linux-chenyang/ # #类体现出对象与对象交互的概念 class Garen: #lol游戏人物盖伦 camp=‘Demacia‘ #阵营:德玛西亚 def __init__(self,nickname,aggresivity,life_value): #每个玩家都有共同的属性:名字,攻击力,生命值 self.nickname = nickname self.aggresivity = aggresivity self.life_value = life_value def attack(self,enemy): #定义一个攻击的属性 print(‘is attacking....‘,self,enemy) class Riven: camp=‘Noxus‘ def __init__(self, nickname, aggresivity, life_value): # 每个玩家都有共同的属性:名字,攻击力,生命值 self.nickname = nickname self.aggresivity = aggresivity self.life_value = life_value def attack(self, enemy): # 定义一个攻击的属性 print(‘is attacking....‘, self, enemy) enemy.life_value -= self.aggresivity #g1的最后生命值就是g1现在的生命值减去r1的攻击力 g1 = Garen(‘草丛伦‘,82,100) r1 = Riven(‘hahah‘,20,1000) #模拟riven英雄攻击garen英雄 r1.attack(g1) print(g1.life_value) #所以最后g1的生命值就是100-20
# -*- coding: UTF-8 -*- #blog:http://www.cnblogs.com/linux-chenyang/ # #写一个类的过程:举列,女娲造人 #第一步:先想下人(实例)有什么通用的属性,私有的属性,共同的技能,先站住实例的角度去想 #第二步:写的时候在开始写class,然后在生成实例 class Chinese: dang = ‘gongchandang‘ #通用的属性 def __init__(self,name,age,gender): #私有的属性 self.name = name self.age = age self.gender = gender def talk(self): print(‘chifan shuijiao dadoudou......‘) #共同的技能 d=Chinese(‘lijun‘,18,‘F‘)
Python_oldboy_自动化运维之路_面向对象2(十)