Python课程第八天作业
第一题:
1.自定义一个 Fruit 类:该类有一个 类属性: identify:值为"水果",有两个对象属性: name,price:值由实例化对象时赋值,一个类方法: get_identify:打印类属性identify的值,一个对象方法:get_total_price(num):打印『%s个%s值%s钱』,一个静态方法:packing(*fruits) 静态方法(装箱)的思路分析 red_apple = Fruit("红苹果", 10) green_apple = Fruit("青苹果", 10) yellow_banana = Fruit("黄香蕉", 8) 调用:Frulit.packing(red_apple, green_apple, yellow_banana) 打印:一箱装了2个苹果1个香蕉
示例代码:
#!/usr/bin/env python # -*- coding: utf-8 -*- class Fruit: identify = '水果' def __init__(self,name,price): self.name = name self.price = price @classmethod def get_identify(cls): print(cls.identify) def get_total_price(self,num): total_price = self.price * num print('%s个%s值%s钱' % (num, self.name, total_price)) @staticmethod def packing(*fruits): fruit_type=[] for i in fruits: if "苹果" in i.name: fruit_type.append("苹果") if "香蕉" in i.name: fruit_type.append("香蕉") print('总共装箱数量为:') for k in set(fruit_type): print("%d个%s"%(fruit_type.count(k),k)) red_apple = Fruit("红苹果", 10) green_apple = Fruit("青苹果", 10) yellow_banana = Fruit("黄香蕉", 8) black_banana = Fruit("泰国香蕉",88) Fruit.packing(red_apple,green_apple,yellow_banana,black_banana)
第二题:
-- 对name属性进行封装,但是外界任然可以访问name以及设置name -- 有一个方法属性bmi(标准体重),可以获取一个人的bmi,bmi只读不可写,bmi计算规则 -- 男:(身高cm-80)× 70﹪ | 女:(身高cm-70)× 60﹪ 提示:类属性就是直接写在类中的变量,对象属性就是写在__init__方法中的用self.属性 = 值 赋值的属性,方法属性就是用 @property 修饰的方法伪装成的属性
示例代码:
class Person: def __init__(self, name, weight, height, sex): self.name = name self.weight = weight self.height = height self.sex = sex @property def bmi(self): if self.sex == '男': return (self.height -80) * 0.7 return (self.height - 70) * 0.6 tom=Person('tom',92,175,'男') print("%s 标准体重为 %.2f" %(tom.name,tom.bmi)) marry=Person('marry',88,168,'女') print("%s 标准体重为 %.2f" %(marry.name,marry.bmi))
第三题:
用面向对象实现 植物大战僵尸游戏 1.定义一个僵尸Zombie类,该类可以实例化出多种僵尸对象,僵尸对象产生默认都有 名字name、血量HP、防具armor -- 名字:普通僵尸 | 路障僵尸 | 铁桶僵尸 -- 血量:默认就是100,不需要外界提供 -- 防具:不需要外界提供,从名字中分析确定,防具的值是一个列表,从名字分析得到 -- ['无', 0] | ['路障', 5] | ['铁桶', 15] => [防具名, 防具的防御值] -- 通过@property的getter、setter方式,对外提供防具的两个访问接口armor_name与armor_count -- armor_name可以取值、赋值、删除值:通过一个 -- eg: 普通僵尸对象.armor_name = '铁桶',不仅改变了防具名 -- 普通僵尸对象的名字name也会变成 铁桶僵尸 -- armor_count只可以取值 2.定义一个角色User类,该类有名字name属性、以及打僵尸的beat方法 -- 名字:随意自定义 -- beat:该方法需要传入一个僵尸对象 -- 在方法内部可以实现:某某用户攻击了某某个僵尸,僵尸损失多少血,还剩多少血 -- 每一次攻击,都固定扣除25滴血,但是不同的僵尸会被防具相应抵消掉一定的伤害值 -- 循环攻击僵尸,3s攻击一次,僵尸被击杀后,打印 某某用户击杀了某某个僵尸 并结束方法 3.定义一个Game类,该类有一个name属性,属性值为 "植物大战僵尸" ,该类中有一个start方法,通过Game.start()来启动游戏 -- 游戏一开始先显示游戏的名字 植物大战僵尸游戏 -- 会随机产生三种僵尸,总共产生三个作为要被击杀的对象 -- 生成一个有角色名的角色,依次去击杀随机产生的每一只僵尸 -- 开始击杀第一只僵尸 => 某某用户攻击了某某个僵尸,僵尸损失多少血,还剩多少血 => 某某用户击杀了某某个僵尸 => 第一只僵尸已被击杀完毕 => 开始击杀第二只僵尸 ... => 第三只僵尸已被击杀完毕
示例代码:
import time import random class Zombie: def __init__(self, name): self.armor_type = {'普通僵尸': 0, '路障僵尸': 5, '铁桶僵尸': 15} self.__name = name self.HP = 100 self.armor = self.armor_type[self.__name] @property def armor_name(self): return self.armor, self.__name @armor_name.setter def armor_name(self, value): self.__name = value self.armor = self.armor_type[value] @property def armor_count(self): return self.armor class User: def __init__(self, name): self.name = name def beat(self, zombie): while True: time.sleep(1) lose_blood = 25 - zombie.armor_count if zombie.HP <= lose_blood: print('%s击杀了%s' % (self.name, zombie.armor_name[1])) break zombie.HP -= lose_blood print('%s攻击了%s,%s损失了%s滴血,还是剩%s滴血' % ( self.name, zombie.armor_name[1], zombie.armor_name[1], lose_blood, zombie.HP)) class Game: name = "植物大战僵尸" @classmethod def start(self): print('%s游戏' % self.name) zombie_list = ['普通僵尸', '路障僵尸', '铁桶僵尸'] count = 0 while count < 3: count += 1 #zombie_type = zombie_list[random.randint(1, 10000) % 3] zombie_type = random.choice(zombie_list) zombie_name = Zombie(zombie_type) print('开始击杀第%s次僵尸' % (count)) CJK = User('苍井空') CJK.beat(zombie_name) Game.start()
"一劳永逸" 的话,有是有的,而 "一劳永逸" 的事却极少