面向对象和模块练习题

# 1、new方法和init方法执行的执行顺序

# 先执行new方法创建出对象,之后再执行init给对象封装属性。

# 2、__call__方法在什么时候被调用

# 对象+()即可触发该方法。

# 3、 请用写一个类,用反射为这个类添加一个静态属性
class A:
    def __init__(self, area):
        self.area = area

    pass


setattr(A, 'country', '中国')
print(A.__dict__)

# 4、请用反射为上题的类的对象添加一个属性name,值为你的名字。

class A:
    def __init__(self, area):
        self.area = area

    pass


setattr(A, 'country', '中国')

obj = A('吉林')
setattr(obj, 'name', '马玉刚')
print(getattr(obj, 'name'))

# 5、请使用new方法实现一个单例模式
class A:
    __instance = None

    def __new__(cls, *args, **kwargs):
        if cls.__instance == None:
            obj1 = object.__new__(cls)
            cls.__instance = obj1

        return cls.__instance


ret1 = A()
ret2 = A()
ret3 = A()
print(ret1, ret2, ret3)

# 6、生成一个6位随机验证码(包含数字和大小写字母)
import random


def code():
    codes = ''
    for i in range(6):
        num = str(random.randint(0, 9))  # 任意选择一个数字
        char1 = chr(random.randint(97, 122))  # 任意选择一个小写字母
        char2 = chr(random.randint(65, 90))  # 任意选择一个大写字母
        c1 = random.choice([num, char1, char2])  # 大写字母、小写字母、数字任选其一
        codes += c1
    return codes


print(code())

# 7、发红包、制定金额和个数随机分配红包金额
'''
隐性的限制条件:
(1)钱数最少为1分。
(2)金额与个数的相除需要除尽,如果不能除尽则需要四舍五入。
(3)所有红包的金额总数与发红包开始的制定金额需要相同。
(4)每次分配出红包后,需要减去,下一次在随机分发的时候,是剩余未分配的金额。

思路:
(1)制定金额和设置个数。
(2)根据个数进行进行循环随机取值。
(3)每次取值的最大值是剩余未分配金额。
(4)最后一次取值取值等于制定的金额数与所有已分配红包金额总数的差。
'''
import random
# b = random.uniform(1,100)
# print(round(b,2))

money = input('请输入金额:').strip()
num = input('请输入红包个数:').strip()


if money.replace(".", '').isdigit():  # 判断输入的是否是金额
    if type(eval(money)) == int:
        n = 0
        if num.isdigit():
            if int(num) == 1:
                print(money)
                exit()
            elif n > 1:
                money = int(money)
                num = int(num)
                if money*100 >= num:
                    for i in range(num):
                        a = random.uniform(0.01,money)
                        a = round(a,2)
                        print(a)
                        n = n + 1
                        money = money - a
                        money = round(money, 2)
                        if int(num) - n == 1:
                            print(money)
                            break
                else:
                    print('您输入的红包个数超过最大个数,请重新输入')
                    exit()
            else:
                print('您输入的红包个数并非数字,请您输入数字')
    elif type(eval(money)) == float:
        l = money.split(".")
        c = len(l[1])  # 判断小数点的长度
        n = 0
        if c <= 2:  # 判断金额是否是小数点后两位。
            money = float(money)
            if num.replace(".", '').isdigit():
                if int(num) == 1:
                    print(money)
                    exit()
                elif money*100 >= float(num):
                    for i in range(int(num)):
                        a = random.uniform(0.01,money)
                        a = round(a,2)
                        print(a)
                        n = n + 1
                        money = money - a
                        money = round(money, 2)
                        if int(num) - n == 1:
                            print(money)
                            break
                else:
                    print('您输入的红包个数超过最大个数,请重新输入')
                    exit()
            else:
                print('您输入红包个数不正确,请重新输入')
        else:
            print('输入金额最多小数点后两位,请重新输入')
    else:
        print('您输入的并非是数字,请您输入数字')
else:
    print('您的输入金额有误,请重新输入')

 

posted @ 2018-11-25 20:25  马玉刚  阅读(132)  评论(0)    收藏  举报