• 类名称空间,查询顺序,组合


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

    而类有两种属性:静态属性和动态属性

    • 静态属性就是直接在类中定义的变量
    • 动态属性就是定义在类中的方法
     查询顺序:
       对象 . 属性 : 先从对象空间找,如果找不到,再从类空间找,再找不到,再从父类找....
       类名 . 属性 : 先从本类空间找,如果找不到,再从父类找....
    class Person:
        animal = '高级动物'
        soul = '有灵魂'
        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):
            print('工作')
    p1 = Person('菲律宾','alex','未知',42,175)  结果为:高级动物
    print(p1.animal)
    
    p1.animal = '禽兽'   
    print(p1.animal)    结果为:禽兽

    二.计算一个类实例化多少对象

    class Count:
        count = 0
    
        def __init__(self):
            Count.count = Count.count + 1
    
    
    obj1 = Count()
    obj2 = Count()
    obj2 = Count()
    obj2 = Count()
    obj2 = Count()
    
    print(Count.count)   结果:5
    通过类名可以更改我的类中的静态变量值
    Count.count = 6
    print(Count.__dict__)
    结果:
    {'__init__': <function Count.__init__ at 0x00000207E680F378>, '__doc__': None,
    '__weakref__': <attribute '__weakref__' of 'Count' objects>, '__module__': '__main__',

    '__dict__': <attribute '__dict__' of 'Count' objects>, 'count': 6}
    但是通过对象 不能改变只能引用类中的静态变量
    obj1 = Count()
    print(obj1.count)
    obj1.count = 6

    三.组合

    组合: 给一个类的对象封装一个属性,这个属性是另一个类的对象.

    ''''模拟英雄联盟写一个游戏人物的类(升级题).
      要求:
      (1)创建一个 Game_role的类.
      (2) 构造方法中给对象封装name,ad(攻击力),hp(血量).三个属性.
      (3) 创建一个attack方法,此方法是实例化两个对象,互相攻击的功能:
          例: 实例化一个对象 盖伦,ad为10, hp为100
          实例化另个一个对象 剑豪 ad为20, hp为80
          盖伦通过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))
    
    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('大阳哥',20,500)
    p2 = GameRole('印度阿宁',50,200)
    axe = Weapon('三板斧',60)
    broadsword = Weapon('屠龙宝刀',100)
    
    axe.fight(p1,p2)
    broadsword.fight(p2,p1)
    结果:
    大阳哥 用三板斧打了印度阿宁,印度阿宁 掉了60血,还剩140血
    印度阿宁 用屠龙宝刀打了大阳哥,大阳哥 掉了100血,还剩400血

    版本二:

    class GameRole:
        def __init__(self, name, ad, hp):
            self.name = name
            self.ad = ad
            self.hp = hp
        def armament_weapon(self, wea):
            self.wea = wea
    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('大阳哥', 20, 500)
    p2 = GameRole('印度阿宁', 50, 200)
    axe = Weapon('三板斧', 60)
    broadsword = Weapon('屠龙宝刀', 100)
    p1.armament_weapon(axe)  # 给大阳哥 装备了三板斧这个对象.
    p1.wea.fight(p1, p2)
  • 相关阅读:
    Phaser中很多对象都有一个anchor属性
    prelaod场景,用来显示资源加载进度
    Eclipse rap 富客户端开发总结(11) : rcp/rap与spring ibatis集成
    Eclipse rap 富客户端开发总结(10) : Rap不同系统间的差异和处理方式
    Eclipse rap 富客户端开发总结(9) : rap上传与下载
    Eclipse rap 富客户端开发总结(8) : 发布到tomcat后解决rap编码和字符集的问题
    Eclipse rap 富客户端开发总结(7) : 如何修改rap的样式
    Eclipse rap 富客户端开发总结(6) : 如何发布rap到tomcat
    Eclipse rap 富客户端开发总结(5): RAP国际化之路
    Eclipse rap 富客户端开发总结(4):如何搭建 rap 中文开发环境
  • 原文地址:https://www.cnblogs.com/shuai1993/p/9360525.html
Copyright © 2020-2023  润新知