标签:研究 名称 agg 语法 money 函数名 变化 软件质量 fun
一、面向过程和面向对象的比较1、面向过程
面向过程的程序设计:核心是过程二字,过程指的是解决问题的步骤,是一种机械式的思维方式。
优点是:复杂度的问题流程化,进而简单化
缺点是:一套流水线或者流程就是用来解决一个问题,程序扩展困难,牵一发而动全身。
应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等。
2、面向对象
面向对象的程序设计:核心是对象二字,对象是特征与技能的结合体,基于面向对象设计程序就好比在创造一个世界,存在的皆为对象,不存在的也可以创造出来。
优点是:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中。
缺点:
1. 编程的复杂度远高于面向过程,不了解面向对象而立即上手基于它设计程序,极容易出现过度设计的问题。一些扩展性要求低的场景使用面向对象会徒增编程难度,比如管理linux系统的shell脚本。
2. 无法很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,无法准确地预测最终结果,只有对象之间交互才能准确地知道最终的结果。
应用场景:需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方
#面向对象的程序设计并不是全部。对于一个软件质量来说,面向对象的程序设计只是用来解决扩展性。
二、类与对象
1、类的介绍
类即类别、种类,是面向对象设计最重要的概念,对象是特征与技能的结合体,而类则是一系列对象相似的特征与技能的结合体
在现实世界中:先有对象,再有类
在程序中: 务必保证先定义类,后产生对象
2、定义类
class Student: school = 'Middle school' #数据属性 def learn(self): #函数属性 print('is learning') def sleep(self): print('is sleeping')
# 注意:
1.类中可以有任意python代码,这些代码在类定义阶段便会执行
2.因而会产生新的名称空间,用来存放类的变量名与函数名,可以通过OldboyStudent.__dict__查看
3.对于经典类来说我们可以通过该字典操作类名称空间的名字(新式类有限制),但python为我们提供专门的.语法
4.点是访问属性的语法,类中定义的名字,都是类的属性
3、类的用法
基于上面定义的类来研究用法:
print(Student.school) #结果是Middle school print(Student.__dict__) #查看类名称空间的信息 print(Student.learn) #结果是<function Student.learn at 0x00000000021C98C8> Student.age=18 #添加属性 print(Student.age) Student.school = 'Primary school' #修改属性 print(Student.school) #结果是Primary school del Student.age #删除属性 print(Student.age) #报错,age属性找不到,说明已经删除了
4、类在程序中的应用
class Student: school = 'Middle school' def __init__(self,name,age,sex): #实例化得到特有的信息 self.name=name self.age=age self.sex=sex def learn(self): #函数属性 print('%s is learning' %self.name) stu1=Student('wang',20,'male') stu2=Student('li',22,'male') print(stu1.__dict__) #{'name': 'wang', 'age': 20, 'sex': 'male'} print(stu2.__dict__) #{'name': 'li', 'age': 22, 'sex': 'male'} Student.learn(stu1) #结果wang is learning
补充:
(1)站的角度不同,定义出的类是截然不同的,详见面向对象实战之需求分析
(2)现实中的类并不完全等于程序中的类,比如现实中的公司类,在程序中有时需要拆分成部门类,业务类......
(3)有时为了编程需求,程序中也可能会定义现实中不存在的类,比如策略类,现实中并不存在,但是在程序中却是一个很常见的类
5、用类实现数据库连接:
class MySQLHandler: def __init__(self,host,port,db,charset='utf8'): self.host=host self.port=port self.db=db self.charset=charset self.conn=connect(self.host,self.port,self.db,self.charset) def exc1(self,sql): return self.conn.execute(sql) def exc2(self,sql): return self.conn.call_proc(sql) obj=MySQLHandler('127.0.0.1',3306,'db1') obj.exc1('select * from tb1;') obj.exc2('存储过程的名字')
三、属性查找
1、类的属性
类有两种属性:数据属性和函数属性
(1)类的数据属性是所有对象共享的
(2)类的函数属性是绑定给对象用的
2、实例:编写一个学生类,产生一堆学生对象,要求有一个计数器(属性),统计总共实例了多少个对象
class Student: count=0 def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex Student.count+=1 def learn(self): #函数属性 print('is learning') stu1=Student('wang',20,'male') stu2=Student('li',22,'male') stu3=Student('jim',25,'male') print(stu1.count) #结果为3 print(stu2.count) #结果为3 print(stu3.count) #结果为3
3、绑定到对象的方法
类中定义的函数(没有被任何装饰器装饰的)是类的函数属性,类可以使用,但必须遵循函数的参数规则,有几个参数需要传几个参数
类中定义的函数(没有被任何装饰器装饰的),其实主要是给对象使用的,而且是绑定到对象的,虽然所有对象指向的都是相同的功能,但是绑定到不同的对象就是不同的绑定方法
强调:绑定到对象的方法的特殊之处在于,绑定给谁就由谁来调用,谁来调用,就会将‘谁’本身当做第一个参数传给方法,即自动传值(方法__init__也是一样的道理)
注意:绑定到对象的方法的这种自动传值的特征,决定了在类中定义的函数都要默认写一个参数self,self可以是任意名字,但是约定俗成地写出self。
四、对象之间的交互
1、简单实现对战
class Poilce: camp ='justice' #阵营是正义 def __init__(self,name,attacking=55,life_value=300): self.name=name self.attacking=attacking self.life_value=life_value def attack(self,opponent): #定义攻击,指定对手 opponent.life_value-=self.attacking class Robber: camp ='evil' #阵营是邪恶 def __init__(self,name,attacking=60,life_value=270): self.name=name self.attacking=attacking self.life_value=life_value def attack(self,opponent): #定义攻击,指定对手 opponent.life_value-=self.attacking p1=Poilce('大兵') r1=Robber('海盗') print('p1的名字是%s r1的名字是%s '%(p1.name,r1.name)) #p1的名字是大兵 r1的名字是海盗 print('p1的生命值是%s r1的生命值是%s '%(p1.life_value,r1.life_value)) #p1的生命值是300 r1的生命值是270 p1.attack(r1) #p1发起攻击 print('p1的生命值是%s r1的生命值是%s '%(p1.life_value,r1.life_value)) #p1的生命值是300 r1的生命值是215
2、基于面向对象设计一个对战游戏
class Riven: camp='Noxus' #Noxus阵营 def __init__(self,nickname, aggressivity=54, #攻击力 life_value=414, #生命值 money=1001, armor=3): #盔甲 self.nickname=nickname self.aggressivity=aggressivity self.life_value=life_value self.money=money self.armor=armor def attack(self,enemy): damage_value=self.aggressivity-enemy.armor #给对方造成的伤害值 enemy.life_value-=damage_value #对手每次受到伤害生命值需要减掉伤害值 class Garen: camp='Demacia' def __init__(self,nickname, aggressivity=58, life_value=455, money=100, armor=10): self.nickname=nickname self.aggressivity=aggressivity self.life_value=life_value self.money=money self.armor=armor def attack(self,enemy): damage_value=self.aggressivity-enemy.armor enemy.life_value-=damage_value class BlackCleaver: #定义装备 def __init__(self,price=475,aggrev=9,life_value=100): self.price=price self.aggrev=aggrev self.life_value=life_value def update(self,obj): obj.money-=self.price #减钱 obj.aggressivity+=self.aggrev #加攻击 obj.life_value+=self.life_value #加生命值 def fire(self,obj): #这是该装备的主动技能,喷火,烧死对方 obj.life_value-=1000 #假设火烧的攻击力是1000
测试:
r1=Riven('草丛伦') g1=Garen('盖文') b1=BlackCleaver() print(r1.aggressivity,r1.life_value,r1.money) #r1的攻击力,生命值,护甲 54 414 1001 if r1.money > b1.price: #r1的钱足够买装备,就执行装备类的update函数,给r1修改属性 r1.b1=b1 b1.update(r1) print(r1.aggressivity,r1.life_value,r1.money) #r1的攻击力,生命值,护甲 63 514 526 print(g1.life_value) #g1生命值455 r1.attack(g1) #普通攻击(现在r1的攻击是穿上装备后的攻击力) print(g1.life_value) #g1生命值402 r1.b1.fire(g1) #用装备攻击 print(g1.life_value) #g1的生命值小于0就死了,值为-598
标签:研究 名称 agg 语法 money 函数名 变化 软件质量 fun
原文地址:http://blog.51cto.com/qidian510/2061458