zoukankan      html  css  js  c++  java
  • 面向对象(类名称空间,查询顺序,组合)

    创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性

    创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性

    查询顺序:
    对象.属性 : 先从对象空间找,如果找不到,再从类空间找,再找不到,再从父类找....
    class Person:
        animal = "高级动物"
        soup = "有灵魂"
        language = "语言"
        def __init__(self, country, name, sex, age, hight):
            self.country = country
            self.name = name
            self.sex = sex
            self.age = age
            self.hight = hight
        def eat(self):
            print("%s在吃饭" % self.name)
        def sleep(self):
            print("睡觉")
        def work(self):
            pass
    p1=Person("美国","武大","",35,160)
    print(p1.name)
    print(p1.animal)
    print(p1.sleep())
    武大
    高级动物
    睡觉
    None
    类名.属性 : 先从本类空间找,如果找不到,再从父类找....
    class Person:
        animal = "高级动物"
        soup = "有灵魂"
        language = "语言"
        def __init__(self, country, name, sex, age, hight):
            self.country = country
            self.name = name
            self.sex = sex
            self.age = age
            self.hight = hight
        def eat(self):
            print("%s在吃饭" % self.name)
        def sleep(self):
            print("睡觉")
        def work(self):
            pass
    print(Person.animal)
    结果:高级动物
    Person.__dict__["sleep"](11)
    结果:睡觉
    print(Person.name)
    结果:报错
    对象与对象之间是互相独立的.

    计算一个类 实例化多少对象.
    class Count:
        count=0
        def __init__(self):
            Count.count=self.count+1
    ret=Count()
    ret1=Count()
    ret2=Count()
    print(Count.count)
    结果:3
    
    
    通过类名可以更改我的类中的静态变量值
    class Count:
        count=0
        def __init__(self):
            pass
    Count.count=6
    print(Count.__dict__)
    
    {'__module__': '__main__', 'count': 6, '__init__': <function Count.__init__ at 0x0000022D460C8D90>,
    '__dict__': <attribute '__dict__' of 'Count' objects>, '__weakref__': <attribute '__weakref__' of 'Count' objects>, '__doc__': None}
    
    
    但是通过对象 不能改变只能引用类中的静态变量
    class Count:
        count=0
        def __init__(self):
            pass
    ret=Count()
    print(ret.count)
    ret.count=6
    结果:0
    
    

    组合:

    3,模拟英雄联盟写一个游戏人物的类.
    要求:
    (1)创建一个 Game_role的类.
    (2) 构造方法中给对象封装name,ad(攻击力),hp(血量).三个属性.
    (3) 创建一个attack方法,此方法是实例化两个对象,互相攻击的功能:
    例: 实例化一个对象 盖伦,ad为20, hp为500
    实例化另个一个对象 剑豪 ad为50, hp为200
    盖伦通过attack方法攻击剑豪,此方法要完成 '谁攻击谁,谁掉了多少血, 还剩多少血'的提示功能.
    
    
    class GameRole:
        def __init__(self, name, ad, hp):
            self.name = name
            self.ad = ad
            self.hp = hp
    
        def attack(self,p):
            p.hp = p.hp - self.ad
            print('%s 攻击 %s,%s 掉了%s血,还剩%s血' %(self.name,p.name,p.name,self.ad,p.hp))
    
    p1 = GameRole('盖伦',20,500)
    p2 = GameRole('亚索',50,200)
    p1.attack(p2)
    print(p2.hp)
    
    盖伦 攻击 亚索,亚索 掉了20血,还剩180血
    180
    View Code
    
    
    组合: 给一个类的对象封装一个属性,这个属性是另一个类的对象.
    版本一:
    class GameRole:
        def __init__(self, name, ad, hp):
            self.name = name
            self.ad = ad
            self.hp = hp
    class Weapon:
        def __init__(self,name,ad):
            self.name = name
            self.ad = ad
        def fight(self,p1,p2):
            p2.hp=p2.hp-self.ad
            print("%s用%s打了%s,%s掉了%s滴血,还剩下%s滴血" % (p1.name,self.name,p2.name,p2.name, self.ad,p2.hp))
    p1=GameRole("剑姬",100,1000)
    p2=GameRole("诺手",80,1200)
    axe=Weapon("诺克萨斯斧",60)
    sword=Weapon("无双剑",80)
    sword.fight(p1,p2)
    axe.fight(p2,p1)
    
    剑姬用无双剑打了诺手,诺手掉了80滴血,还剩下1120滴血
    诺手用诺克萨斯斧打了剑姬,剑姬掉了60滴血,还剩下940滴血
    View Code
    
    

      版本二:

        def __init__(self, name, ad, hp):
            self.name = name
            self.ad = ad
            self.hp = hp
        def weapon(self,obj):
            self.obj=obj
    class Weapon:
        def __init__(self,name,ad):
            self.name = name
            self.ad = ad
        def fight(self,p1,p2):
            p2.hp=p2.hp-self.ad
            print("%s用%s打了%s,%s掉了%s滴血,还剩下%s滴血" % (p1.name,self.name,p2.name,p2.name,
                                                  self.ad,p2.hp))
    p1=GameRole("剑姬",100,1000)
    p2=GameRole("诺手",80,1200)
    axe=Weapon("诺克萨斯斧",60)
    sword=Weapon("无双剑",80)
    p1.weapon(sword)     #  给P1装备了一件武器
    p2.weapon(axe)       #  给p2装备了一件武器
    p1.obj.fight(p1,p2)
    p2.obj.fight(p2,p1)
    
    剑姬用无双剑打了诺手,诺手掉了80滴血,还剩下1120滴血
    诺手用诺克萨斯斧打了剑姬,剑姬掉了60滴血,还剩下940滴血
     
     
     


     
  • 相关阅读:
    吴裕雄--天生自然C语言开发:共同体
    吴裕雄--天生自然C语言开发:结构体
    吴裕雄--天生自然C语言开发:字符串
    吴裕雄--天生自然C语言开发:函数指针
    吴裕雄--天生自然C语言开发:指针
    吴裕雄--天生自然C语言开发:enum(枚举)
    100个容器周边项目,点亮你的容器集群技能树
    论云时代最经济的APM工具的姿势
    “弹性裸金属服务器”到底有那些特性?
    弹性裸金属服务器服务于市场的技术概要分析
  • 原文地址:https://www.cnblogs.com/chenyibai/p/9360293.html
Copyright © 2011-2022 走看看