20221120-python编程语言2

PPT

霍格沃兹测试开发

课堂内容

  • Python 面向对象
  • 作业讲解
  • 课堂实战(1小时)
  • 实战讲解

image
image

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()
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()

这个需求怎么实现啊,有想到的么?万一群主也参与抢红包了,如何返回群主不能抢红包的提示呢?或者说怎么调用群主抢红包的方法呢?