PPT
课堂内容
- Python 面向对象
- 作业讲解
- 课堂实战(1小时)
- 实战讲解
class Human(object):
"""人类"""
# 类属性
on_earth = True
population = 0
# 构造方法
def __init__(self, name, age):
# 实例属性
self.name = name
self.age = age
# 实例方法
def speak(self):
print(self.name, self.age)
# 类方法
@classmethod
def load_from_csv(cls):
pass
# 静态方法
@staticmethod
def war():
pass
实战练习
抢红包案例
某群有多个成员,群主给成员发普通红包。
发红包的规则是:
1、群主负责发红包,不能抢红包。红包金额从群主余额中扣除,按成员人数平均分成n等份,以备领取。
每个红包的金额为整数,如果有余数则加到最后一个红包中。
2、成员负责抢红包。抢到的红包金额存到自己余额中。
3、抢完红包后需要进行报数,打印格式“我是XX,现在有 XX 块钱。”。
请根据描述信息,完成案例中所有类的定义、类之间的继承关系,以及发红包、抢红包的操作。
一、分析
"""
import random
class Person:
def __init__(self, name, money):
self.name = name
self.money = money
# 报数
def show(self):
print(f"我是{self.name}, 我现在有{self.money}块钱")
class Manager(Person):
# 发红包
def send(self, money, num):
"""
红包余额从群主余额中扣除,按成员人数平均分成n等份,每个红包金额为整数,如果有余数则加到最后一个红包中
:param money:发多少的红包
:param num:分数
:return:
"""
red_list = []
if money > self.money:
print("大忽悠")
else:
# 扣钱
self.money = self.money - money
# 分红包
# avg平均数
avg = money // num
# mod余数
mod = money % num
# 先均分
for i in range(num):
red_list.append(avg)
# 在考虑余数
red_list[-1] = red_list[-1] + mod
return red_list
class Member(Person):
# 抢红包
def grab(self, red_list):
""" random.randint [10, 10, 10, 16]
抢到的红包金额存到自己的余额中,抢完后要进行报数
:param red_list: 红包列表 red_list.pop
:return:
"""
if not red_list:
print("太小气了,一块钱都不发")
return None
# 从一堆红包中随机挑选一个
random_index = random.randint(0, len(red_list) - 1)
lucky_money = red_list.pop(random_index)
print(f"我是{self.name}, 我抢到了{lucky_money}")
# 存钱
self.money = self.money + lucky_money
return self.money
if __name__ == '__main__':
print("=========游戏开始=============")
banzhuren = Manager("班主任", 1000000)
m1 = Member("杜安", 10000000)
m2 = Member("库丘林", 2)
m3 = Member("来自星星的涛", 0)
# 开局前防止作弊
banzhuren.show()
m1.show()
m2.show()
m3.show()
print("============开始发红包===========")
red_li = banzhuren.send(10000, 3)
print("=============抢红包===============")
m1.grab(red_li)
m2.grab(red_li)
m3.grab(red_li)
import random
class Person:
def __init__(self, name, money):
self.name = name
self.money = money
self.show()
# 报数
def show(self):
print(f'我是{self.name},我现在有{self.money}元')
class Manager(Person):
# 发红包
def send(self, send_money, num):
"""
红包余额从群主余额中扣除,按成员人数平均分成n等份,每个红包金额为整数,如果有余数则加到最后一个红包中
:param money:发多少的红包 自定义发一个自定义的红包金额数量
:param num:分数
:return:
"""
red_list = []
if send_money > self.money:
print(f'你拥有金额小于{send_money}元钱')
else:
# 生成红包列表
for i in range(num):
x = send_money // num # 3个红包,除以3取整
red_list.append(x)
red_list[-1] += send_money % num #
# 扣钱
self.money -= send_money
# 报数
self.show() # print(f'群主{self.name}发红包金额为{send_money}元,发红包数量为{num},红包列表为:{red_list}')
return red_list # 返回红包列表
class Member(Person):
# 抢红包
def grab(self, red_list):
"""
抢到的红包金额存到自己的余额中,抢完后要进行报数
:param red_list: 红包列表
:return:
"""
# 抢到红包列表随机金额
red_count = random.choice(red_list)
print(f'成员{self.name}抢到红包金额为{red_count}元')
self.money += red_count
self.show()
red_list.pop(red_list.index(red_count)) # 删除抢到的
print(f'剩下红包列表:{red_list}')
if __name__ == '__main__':
# 群主实例
ma1 = Manager('阿赵', 100)
# 发红包 金额为10元 ,发3个红包
red_list = ma1.send(10, 3) # 返回值为red_list
print(red_list)
# 成员实例
me1 = Member('杜安', 10)
# 抢红包
me1.grab(red_list)
'''
我是阿赵,我现在有100元
我是阿赵,我现在有90元
[3, 3, 4]
我是杜安,我现在有10元
成员杜安抢到红包金额为4元
我是杜安,我现在有14元
剩下红包列表:[3, 3]
'''
"""
抢红包案例
某群有多个成员,群主给成员发普通红包。
发红包的规则是:
1、群主负责发红包,不能抢红包。红包金额从群主余额中扣除,按成员人数平均分成n等份,以备领取。
每个红包的金额为整数,如果有余数则加到最后一个红包中。
2、成员负责抢红包。抢到的红包金额存到自己余额中。
3、抢完红包后需要进行报数,打印格式“我是XX,现在有 XX 块钱。”。
"""
import random
class Person():
def __inIt__(self, name, money):
self.name = name
self.money = money
# 报数,我是*** 我有多少钱
def show(self):
print(f"我是{self.name},我现在有{self.money}元")
class Manager(Person):
"""
发红包
红包金额从群主余额中扣除,按成员人数平均分成n等份
每个红包的金额为整数,如果有余数则加到最后一个红包中
"""
def send(self, money, num):
red_list = []
if money > self.money:
print("群主没有钱")
return red_list
else:
# 从余额里面扣钱
self.money -= money
# 分红包
# avg 平均数 mod 余数
avg = money // num
mod = money % num
# 平均分给人们
for i in range(num):
red_list.append(avg)
# 如果有余数,则加入到最后一个红包里面
red_list[-1] += mod
return red_list
class Member(Person):
"""
成员负责抢红包。抢到的红包金额存到自己余额中
抢完红包后需要进行报数
"""
# 抢红包
def grab(self, red_list):
if not red_list:
print("群主红包余额没有钱")
return None
# 从一堆红包中随机选一个
random_index = random.randint(0, len(red_list) - 1)
lucky_money = red_list.pop(random_index)
print(f"我是{self.name},我抢到了{lucky_money}")
# 存钱
self.money += lucky_money
return self.money
if __name__ == '__main__':
print("============游戏开始============")
banzhuren = Manager("张三", 10000)
m1 = Member("李四", 333)
m2 = Member("王五", 2)
m3 = Member("老六", 0)
banzhuren.show()
m1.show()
m2.show()
m3.show()
print("============开始发红包============")
red_li = banzhuren.send(10000, 3)
print("============抢红包============")
m1.grab(red_li)
m2.grab(red_li)
m3.grab(red_li)
print("============报数============")
m1.grab(red_li)
m2.grab(red_li)
m3.grab(red_li)
import random
class Person:
def __init__(self, name, monkey):
self.name= name
self.monkey= monkey
# 报数
def show(self):
print(f"我是{self.name},我有{self.monkey}元钱。")
class Manager(Person):
# 发红包
def send(self, money, num):
"""
红包余额从群主余额中扣除,按成员人数平均分成n等份,每个红包金额为整数,如果有余数则加到最后一个红包中
:param money:发多少的红包
:param num:分数
:return:
"""
if self.monkey >= money:
a = money % num
b = money // num
red_list= [b]*(num-1)
red_list.append(a+b)
self.monkey = self.monkey - money
print(red_list)
return red_list
class Member(Person):
# 抢红包
def grab(self, red_list):
"""
抢到的红包金额存到自己的余额中,抢完后要进行报数,:param red_list: 红包列表, :return:
"""
if len(red_list) > 0 :
a= len(red_list)-1
b= random.randint(0,a)
c = red_list.pop(b)
self.monkey = self.monkey + c
print(f"w我是{self.name},我抢到了{c}元钱")
return a
else:
print("来晚了,红包已抢完")
if __name__ == '__main__':
a = Manager("群主", 1000)
b = Member("成员1", 100)
c = Member("成员2", 200)
d = Member("成员3", 200)
a.show()
b.show()
c.show()
d.show()
A=a.send(501,2)
b.grab(A)
c.grab(A)
d.grab(A)
a.show()
b.show()
c.show()
d.show()
wxm
(小铭)
6
import random
class Person:
def __init__(self,name,money):
self.name = name
self.money = money
#报数的功能
def show(self):
print(f'我是{self.name},现在有{self.money}块钱')
class Manager(Person):
#发红包
def send(self,money,num):
red_list = []
#如果发的红包大于余额
if money>self.money:
print("余额不足")
return red_list
else:
#扣钱
self.money = self.money-money
#分红包
avg = money//num
mod = money%num
#均分
for i in range(num):
red_list.append(avg)
#考虑余数,加到最后一个红白列表中
red_list[-1]=red_list[-1]+mod
return red_list
class Member(Person):
#抢红包
def grab(self,red_list):
if not red_list:
print('红包为空')
return None
#从一堆红包中随机挑选一个
random_index = random.randint(0,len(red_list)-1)
lucky_money = red_list.pop(random_index)
print(f"我是{self.name},我抢到了{lucky_money}")
#存钱
self.money = self.money + lucky_money
return self.money
if __name__ == '__main__':
print("============游戏开始=============")
banzhuren = Manager("班主任",100000)
m1 = Member("张三",5000)
m2 = Member("李四",2)
m3 = Member("王五",5000)
#开局前防止作弊
banzhuren.show()
m1.show()
m2.show()
m3.show()
print("=================开始发红包==================")
red_li = banzhuren.send(10000,3)
print("=====================抢红包========================")
m1.grab(red_li)
m2.grab(red_li)
m3.grab(red_li)
print("==================报数=======================")
banzhuren.show()
m1.show()
m2.show()
m3.show()
这个需求怎么实现啊,有想到的么?万一群主也参与抢红包了,如何返回群主不能抢红包的提示呢?或者说怎么调用群主抢红包的方法呢?