Python 面向对象程序设计练习3:异常

使用Python实现下述功能。

用户需要注册才能登录系统,注册需要填写账号和两次密码,密码长度小于6位或两次密码不一致抛出对应异常。新注册的用户没有权限。用户登录后,如果有权限,则可以执行吃饭、睡觉、学习3种操作,如果没有权限则抛出异常。管理员可以为用户赋予权限。试图选择不存在的用户会抛出异常。

--------------------------------------------------------------------------

--------------------------------------------------------------------------

--------------------------------------------------------------------------

class User:
    def __init__(self, username, password):
        self.__username = username
        self.__password = password
        self.__permissions = []

    def get_username(self):
        return self.__username

    def get_password(self):
        return self.__password

    def add_permission(self, permission):
        self.__permissions.append(permission)

    def eat(self):
        if "eat" in self.__permissions:
            print("Eating...")
        else:
            raise PermissionError("No permission for eating")

    def sleep(self):
        if "sleep" in self.__permissions:
            print("Sleeping...")
        else:
            raise PermissionError("No permission for sleeping")

    def study(self):
        if "study" in self.__permissions:
            print("Studying...")
        else:
            raise PermissionError("No permission for studying")


class Authenticator:
    __users = []

    def __init__(self):
        pass

    def sign_up(self, username, password1, password2):
        if len(self.__users) == 0:
            if len(password1) < 6:
                raise PasswordTooShortError()
            elif password1 != password2:
                raise PasswordUnequalError()
            else:
                new_user = User(username, password1)
                self.__users.append(new_user)
                print("Sign up success")
        else:
            for user in self.__users:
                if username == user.get_username():
                    raise UsernameAlreadyExistsError(username)
                elif len(password1) < 6:
                    raise PasswordTooShortError()
                elif password1 != password2:
                    raise PasswordUnequalError()
                else:
                    new_user = User(username, password1)
                    self.__users.append(new_user)
                    print("Sign up success")

    def login(self, username, password):
        for user in self.__users:
            if username == user.get_username() and password == user.get_password():
                print("Login success")
                return user
        raise LoginError()


class Authorizer:
    __all_permissions = ["eat", "sleep", "study"]

    def __init__(self):
        pass

    def add_permission_to_user(self, user, permission_number):
        try:
            permission = Authorizer.__all_permissions[permission_number]
        except IndexError:
            raise IndexError("Permission not exists")
        user.add_permission(permission)
        print("Add permission success")


class UsernameAlreadyExistsError(Exception):
    def __init__(self, username):
        self.__username = username

    def __str__(self):
        return f"Username {self.__username} already exists"


class PasswordTooShortError(Exception):
    def __str__(self):
        return "Password too short"


class PasswordUnequalError(Exception):
    def __str__(self):
        return "Two input passwords not equal"


class LoginError(Exception):
    def __str__(self):
        return "Login failed"


if __name__ == "__main__":
    authenticator = Authenticator()
    # 注册
    authenticator.sign_up("user1", "password1", "password1")
    # 登录
    user1 = authenticator.login("user1", "password1")
    authorizer = Authorizer()
    # 增加eat权限
    authorizer.add_permission_to_user(user1, 0)
    user1.eat()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hinomoto Oniko

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值