• [ python ] 类的组合


    首先,使用面向对象是一个人狗大战的实例:

    class Person:
        def __init__(self, name, hp, aggr, sex):
            self.name = name
            self.hp = hp
            self.aggr = aggr
            self.sex = sex
        def hit(self, dog):
            dog.hp -= self.aggr
            print('33[31;1m%s被打,掉了%s的血.33[0m' %(dog.name, self.aggr))
    
    
    class Dog:
        def __init__(self, name, hp, aggr, kind):
            self.name = name
            self.hp = hp
            self.aggr = aggr
            self.kind = kind
        def bite(self, person):
            person.hp -= self.aggr
            print('33[31;1m%s被咬,掉了%s的血.33[0m' %(person.name, self.aggr))
    
    
    per = Person('kk', 100, 2, 'male')
    dog = Dog('teddy', 200, 5, 'teddy')
    
    per.hit(dog)
    dog.bite(per)

    这时,为了增加游戏的趣味性,我们可以给人物添加一个武器,并且人物可以使用武器发大招:

    • 新增武器类;
    • 武器必须给人类装配上才能用;
    • 大招是武器发动的,因此大招应该是武器的一个方法
    • 人类拿着武器发起大招,应该是: 人类.武器.大招

    接下来,就将描述转换为代码:

    class Person:
        '''人类'''
    
        def __init__(self, name, hp, aggr, sex):
            self.name = name
            self.hp = hp
            self.aggr = aggr
            self.sex = sex
            self.price = 0  # 设置人类初始金钱
    
        def hit(self, dog):
            dog.hp -= self.aggr
            print('33[31;1m%s被打,掉了%s的血.33[0m' % (dog.name, self.aggr))
    
        def get_weapon(self, weapon):
            '穿戴武器'
            if self.price > weapon.price:  # 购买武器
                self.price -= weapon.price
                self.weapon = weapon  # 带上武器
    
    
    class Dog:
        '''狗类'''
    
        def __init__(self, name, hp, aggr, kind):
            self.name = name
            self.hp = hp
            self.aggr = aggr
            self.kind = kind
    
        def bite(self, person):
            person.hp -= self.aggr
            print('33[31;1m%s被咬,掉了%s的血.33[0m' % (person.name, self.aggr))
    
    
    class Weapon:
        def __init__(self, name, aggr, njd, price):
            self.name = name
            self.aggr = aggr
            self.njd = njd
            self.price = price
    
        def dazhao(self, dog):
            if self.njd > 0:
                dog.hp -= self.aggr * 2
                print('33[33;1m【%s】使用武器【%s】,发大招伤害【%s】33[0m' % (dog.name, self.name, self.aggr * 2))
    
    
    per = Person('kk', 100, 2, 'male')
    dog = Dog('teddy', 200, 5, 'teddy')
    
    per.hit(dog)
    dog.bite(per)
    hit_dog = Weapon('dbg', 20, 3, 998)  # 实例化一个武器对象-打狗棒
    per.price += 998  # 冲钱才能变强
    per.get_weapon(hit_dog)  # 人物装备上武器
    per.weapon.dazhao()  # 人物使用武器发大招

    在上面的这个例子中,我们已经使用到了类的组合。

    当人物需要发大招的时候,人物通过 get_weapon 方法绑定武器,self.weapon 就是武器,而大招是武器中的一个方法,因此使用:
    人物.武器.大招()  这样的调用关系才能使用大招。

    组合就是一个对象的属性值是另一个类的对象 

    练习:
        使用类的组合创建讲师类,有两个类 Teacher 和 brith 类

    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    # Author: hkey
    
    class Teacher:
        def __init__(self, name, age, brith):
            self.name = name
            self.age = age
            self.brith = brith
    
    
    class Brith:
        def __init__(self, year, month, day):
            self.year = year
            self.month = month
            self.day = day
    
    
    brith = Brith(1998, 10, 23)
    
    hkey = Teacher('hkey', 20, brith)
    
    print(hkey.brith.year)
    print(hkey.brith.month)
    练习:组合
  • 相关阅读:
    Android Service 服务(一)—— Service
    ostringstream的使用方法
    【Android动画】之Tween动画 (渐变、缩放、位移、旋转)
    #pragma comment
    添加PDF文件对照度的粗浅原理,及方法
    Jenkins(二)
    “简密”App Store处女作开发总结
    Windows下FFmpeg高速入门
    Storm-0.9.2-incubating源代码编译打包
    几种开源分词工具的比較
  • 原文地址:https://www.cnblogs.com/hukey/p/9884679.html
Copyright © 2020-2023  润新知