码迷,mamicode.com
首页 > 其他好文 > 详细

初学面向对象

时间:2018-01-16 12:25:20      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:研究   名称   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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!