python 面向对象

1.初识面向对象

  人狗大战!

def Person(name,sex,hp,ad):
    #人模板
    self = {'name':name,'sex':sex,'hp':hp,'ad':ad}
    def attack(dog):
        # 人攻击狗
        print('%s攻击%s' % (self['name'], dog['name']))
        # 狗掉血
        dog['hp'] -= self['ad']
        print(dog['hp'])
    self['attack'] = attack
    return self

#规范了属性个数,简化了创造任务的代码
def Dog(name,kind,hp,ad):
    #狗模板
    self = {'name':name,'sex':kind,'hp':hp,'ad':ad}
    def bite(person):
        # 狗攻击人
        print('%s攻击%s' % (self['name'],person['name']))
        # 人掉血
        person['hp'] -= self['ad']
        print(person['hp'])
        if person['hp'] <= 0 :print('game over,%s win'%self['name'])
    self['bite'] = bite
    return self

#人
Alex = Person('a_sb','不祥',1,5)
#狗
chen = Dog('旺财','taidi',50,20)
chen['bite'](Alex)

        从这个例子中可以看出,两个函数分别代表着不同的阵营,一个人一个狗,这就是最初的类的区别,而当中的攻击和啃咬就类中的方法,也就是技能,也是方法 和动态变量,最初的一直没有改变的self这是静态变量。

  类:是一个抽象的范围的统称,包含一组有一定共性的实物。比如:桌子, 书 都是大范围

  对象:具有集体描述其功能和属性的事物就是对象,对一个类的具体描述。比如:书桌上面那本红色的书

2.面想对象的好处:

  1,使代码能够更具体的描述

  2,使代码有更好的拓展性

  3,约束了每个对象的专有函数  

  但是有一大特点:

  最终的结果不确定!

class Person:    《--定义一个类名
    静态变量 = 123  #静态属性 静态变量
    def f1(self):#遵循函数所有的语法,默认带一个参数self
        #当一个函数落到类里面定义的时候就有了两个名字   方法或着动态属性!
        print(12342)
# d对静态属性来说直接返回值,而动态属性则会执行一段代码,再返回值
print(Person.__dict__) #内置的双下方法 # Person.__dict__['静态变量'] = 2 print(Person.__dict__['静态变量']) print(Person.静态变量) Person.静态变量 = 23333 print(Person.静态变量) del Person.静态变量 print(Person.__dict__)

 静态变量调取方法:

  1,Person.__dict__[变量名]

  2,类名.变量名

动态变量调取方法:

  1.类名.函数名   #调取的为函数的地址,返回的是一个地址信息

  2.类名.函数名()  #调用这个方法并且不许传入一个具体的参数,并且这个参数将会传递给self

创造一个对象:

  变量名 = 类名() #直接创建一个对象,并且为对象创建一个单独的内存空间,储存对象的属性(数据)

  创建对象的过程也叫做实例化,类产生一个对象的就是实例化。

    实例化的过程:

      1,创造一个实例,并且 创造一个实参为self。

      2,自动运行类中的__init__函数,并且将self传递进去。

      3,执行完init后返回self

      __init__方法,针对self的方法,给对象添加一些基础属性的方法,一般给self赋值

 

对象:

  1,在类中,对象为self,是本类的一个self

  2,在类外,每个对象都有一个专属空间记录着对象的属性。

  属性的调用:

    1,对象名.属性名

    2,对象.__dict__

  方法的调用:

    1,类名.方法(对象名字)

    2,对象名.方法()

  

 

3.游戏雏形

class Person:
    def __init__(self,name,sex,hp,ad):          #init 内部不能使用return
        self.name,self.sex,self.hp,self.ad = name,sex,hp,ad  #分别赋值缩写,在__dict__中创建k
        # self.name = name
        # self.sex = sex
        # self.hp = hp
        # self.ad = ad
    def attcrt(self,dog):
        print('%s发动了旋风冲锋,冲撞%s,使得%s受到了%d伤害'% (self.name,dog.name,dog.name,dog.ad))
        dog.hp -= self.ad
        if dog.hp <= 0:
            print('{}被打败了,{}win'.format(dog.name,self.name))
            dog.hp = 0
        print(dog.hp)
# def qiyu(self): #利用方法改变对象中的属性 # self.ad += 233 # print('在一个莫名其妙的早上,一个莫名其妙的人给了%s一个莫名其妙的武器,于是%s变强了,伤害增加'%(self.name,self.name)) #self.__dict__['name'] = name class dog: def __init__(self,name,kind,hp,ad): #init 内部不能使用return self.name,self.sex,self.hp,self.ad = name,kind,hp,ad # self.name = name # self.sex = sex # self.hp = hp # self.ad = ad def bite(self,p): #狗的攻击方式 print('%s一个狗撒腿踹到%s的屁股,%s受到了%d伤害'% (self.name,p.name,p.name,self.ad)) p.hp -= self.ad if p.hp <= 0: #判断血量的为0则归零 print('{}被打败了,{}win'.format(p.name,self.name)) p.hp = 0 print(p.hp) alex = Person('渣渣会','不详',50,23) #创造了一个对象, boss_jin = Person('古天乐','公',55,45) cheng = dog('渣渣', '藏獒',66, 233) cheng.bite(alex)

    对象的交互,游戏的最初雏形。

 在游戏雏形中:

   alex.name <--在自己的空间寻找对应名,优先读取自己的空间数据

   alex.attack<--在自己的内存空间中寻找,读取到最后就通过类对象指针找到类的id,引用类中的方法  

 

对象的内存空间里:

    1,只储存对象属性不会储存方法和静态变量

    2,多个有共同属性的对象公用一个类能够节省大量的内存空间。

    3,静态变量于方法对相似的对象是共享的

    4.对象是独立的!!

对于类的空间来说:

    1.方法和静态变量都储存在类空间中

    2.对象不能修改类空间中的数据,而类可以修改对象空间中的数据

 

 思考题:

class Person:
    money = [1]
    def __init__(self,name):
        self.name = name
    def work(self):
        print(self.name,'工作,赚了1000块钱')
        self.money[0] += 1000

father = Person('father')
mother = Person('mother')
mother.work()
father.work()
print(Person.money)   # 2000 or 0?

   请务必注意:对象调取的方法和属性到底是怎么调用的??

思考题2:

class Person:
    money = [0]
    def __init__(self,name):
        self.name = name
    def work(self):
        print(self.name,'工作,赚了1000块钱')
        Person.money =  [Person.money[0] + 1000]

father = Person('father')
mother = Person('mother')
mother.work()
father.work()
print(Person.money)

    注意:同样是对象的调取问题,还有关于他的空间问题!!

 

4.类的组合

  当一个大类需要一个小类中的方法时,将小类变成大类的一个属性,就是类的组合,也就是一个类的对象作为另一个类的属性

  还是利用人狗大战来举例子:

  人和狗的血量和伤害差距过大,想要弥补的话试着增加装备,而装备应该也是一个类,是一个需要被引用的类,因此调用这个类,并且将具体的武器作为这个类的对象,而人这个大类将武器作为他的一个属性之一,每次引用武器属性的时候就可以引用武器类的所有方法,从而使得人可以装备各种武器。

class Animaer:   #创建一个父类  由于

    def __init__(self,name,sex,hp,ad):
        self.name = name
        self.sex = sex
        self.hp = hp
        self.ad = ad
        self.money = 0

class Person(Animaer):   #引用父级

    def attack(self,dog):
        print('%s 使用普通攻击,%s 受到%s 的伤害' % (self.name, dog.name, self.ad))
        dog.hp -= self.hp

    def pay(self):
        k = int(input('请输入你要充值的金额:'))
        self.money += k
        print('你的余额有%s' % self.money)

    def Wear(self,wearpon):
        if self.money >= wearpon.price:
            self.wq = wearpon  #装备武器
            self.money -= wearpon.price
            print('装备完毕')
            print(self.__dict__)
        else:
            print('余额不足,请充值')

    def attack_wear_skill(self, dog):
        if 'wq' in self.__dict__:
            self.wq.skill_(dog)
        else:
            print('请先装备武器')


class Dog:
    def __init__(self,name,sex,hp,ad):
        self.name = name
        self.sex = sex
        self.hp = hp
        self.ad = ad

    def bite(self,person):
        print('%s使用要要攻击,%s受到了%s的伤害' % (self.name,person.name,self.ad))
        person.hp -= self.ad

class Wearpon:
    def __init__(self,name,skill,ad,price):
        self.name = name
        self.ad = ad
        self.skill = skill
        self.price = price

    def skill_(self,dog):
        print('发动技能{}进攻{},{}受到{}的伤害,'.format(self.skill,dog.name,dog.name,self.ad))


alex = Person('积极','攻',200,10)
cheng = Dog('呵呵','母',100, 5)
print(cheng.name)
futou = Wearpon('开山斧','劈山',50,100)


while True:
    li = ['普通攻击','充值','购买武器','发动技能']
    for v,k in enumerate(li,1):   
        print(v,k)
    change = int(input('请输入选择》》'))
    if change == 1:
        alex.attack(cheng)
    elif change == 2:
        alex.pay()
    elif change == 3:
        alex.Wear(futou)
    elif change == 4:
        alex.attack_wear_skill(cheng)
    else:
        print('输入错误')

 

posted @ 2018-04-11 17:54  残烛月夜  阅读(239)  评论(0编辑  收藏  举报