一道Python编程题(类方法,getitem与setitem)

一些说明:
题目由来最近加了个接单做大学生编程作业的兼职群,13日一单的其中一道题,然而那单已经被退回去了,因为群里发的时候,我没看到。。感觉题目挺有意思,就花几个小时做了一下。
有两个坑的地方,一个是Account表里是a_id,所以pymysql返回的字典的key是‘a_id’,而下面是{‘id’:’a01’,’balance’:500},所以如果采用 user=bank_user(‘u01’,’li’,account_list),这种方式初始化,x[‘a_id’]可能有问题。
另一个是测试的时候user = bank_user.from_mysql(‘u01’)误打错为user = bank_user().from_mysql(‘u01’),就一直报没有传参数的错,搞得我怀疑人生。。
好奇的是这个哪个学校的题目,从题目来看感觉学校靠谱。。
题目:
四、(20分)创建一个bank_user类,类的属性包括:用户id (user_id), 用户姓名(user_name)和用户账户列表,该列表的每一个元素表示属于该用户的一个账户,用户账户有两个属性:账户id(account_id) 和账户余额(balance)
创建了bank_user类后可以执行如下操作:
account_list=[{‘id’:’a01’,’balance’:500}, {‘id’:’a02’,’balance’:1500},{‘id’:’a03’,’balance’:2000}]
user=bank_user(‘u01’,’li’,account_list)
生成一个bank_user对象user
执行 user[‘a01’]时,将返回’a01’的余额500
执行 user[‘a01’]=500时,相当于在账户’a01’的:余额上加500
执行 user[‘a01’]=-200时,相当于在账户’a01’的余额上减200,此时需要判断账户余额是否大于200,如果不是,将触发‘账户余额不足‘的值异常 (ValueError)
执行 user[‘a05’]=200时,此时,‘a05’不存在,则创建一个新的账户’a05’,该账户的余额为200,并将新创建的账户添加到对象的account_list之中。
(1) 为bank_user类添加相应的方法,以支持上述操作
(2) 在mysql中存在一个数据库bank, 在bank中有两个表:
Bank_user(user_id,user_name) 属性含义依次为:用户id 和用户name
Account(a_id,balance,user_id) 属性含义依次为:账户id ,账户余额,拥有该账户的用户id
为 bank_user类添加一个类方法from_mysql,该方法的一个参数为user_id
From_mysql方法使用参数user_id检索数据库,返回user_id user_name 以及用户所拥有的账户的id和balance,然后使用这些数据创建一个bank_user对象。

使用说明:
首先需要安装mysql,pymysql,
新建数据库bank
新建表Bank_user,Account

create table Bank_user(user_id VARCHAR(100) NOT NULL, user_name VARCHAR(100) NOT NULL,PRIMARY KEY(user_id))
create table Account(a_id VARCHAR(100) NOT NULL, balance INT,user_id VARCHAR(100) NOT NULL,PRIMARY KEY(a_id));

插入测试数据

insert into Bank_user(user_id,user_name) values ('u01','li');
insert into Account(a_id,balance,user_id) values('a01',500,'u01');

代码:

import pymysql
config = {
          'host':'127.0.0.1',
          'port':3306,
          'user':'root',
          'password':'123456',
          'db':'bank',
          'charset':'utf8mb4',
          'cursorclass':pymysql.cursors.DictCursor,
          }
connection = pymysql.connect(**config)

class bank_user(object):
    def __init__(self, user_id, user_name, account_list):
        self.user_id = user_id
        self.user_name = user_name
        self.account_list = account_list

    def __getitem__(self, key):
        for x in self.account_list:
            if x['a_id'] == key :
                return x['balance'] 

    def __setitem__(self, key, value):
        for x in self.account_list:
            if x['a_id'] == key:
                if value >= 0:
                    x['balance'] += value
                else:
                    if x['balance'] > -(value):
                        x['balance'] += value
                    else:
                        raise KeyError('账户余额不足')

    @classmethod
    def from_mysql(cls,user_id):
        sql = 'SELECT user_id, user_name FROM Bank_user WHERE user_id = %s'
        sql2 = 'SELECT a_id, balance FROM Account WHERE user_id = %s'
        cursor = connection.cursor()
        cursor.execute(sql, (user_id))
        result = cursor.fetchone()
        cursor.execute(sql2, (user_id))
        result2 = cursor.fetchall()
        connection.close();
        user =  cls(user_id=result['user_id'],user_name=result['user_name'],account_list=result2)
        return user

测试效果如下:

>>> from user import bank_user
>>> user = bank_user.from_mysql('u01')
>>> user['a01']
500
>>> user['a01'] = 200
>>> user['a01']
700
>>> user['a01'] = -200
>>> user['a01']
500
>>> user['a01'] = 900
>>> user['a01'] = -1200
>>> user['a01']
200
>>> user['a01'] = -1200
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/yz/user.py", line 33, in __setitem__
    raise KeyError('账户余额不足')
KeyError: '账户余额不足'
>>> exit()

猜你喜欢

转载自blog.csdn.net/yz764127031/article/details/79054823