zoukankan      html  css  js  c++  java
  • 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('输入错误')
    
  • 相关阅读:
    我修改/收藏的CSDN知识.(asp.net JavaScript)
    哪里摔倒就在哪里躺下
    显示存储过程的名称、创建时间、修改时间
    Flash Builder 初试(二)绑定和双向绑定
    C#支持中文的格式化字符长度方法
    Flash Builder 初试(一)信息提示窗口
    Flash Builder 初试(三) 使用摄像头
    Null Object 模式
    开放封闭原则(OCP)
    面向对象设计5大准则
  • 原文地址:https://www.cnblogs.com/wpcbk/p/8797361.html
Copyright © 2011-2022 走看看