python class(类)的简介及 shelve的使用

创建一个自定义的类

#!/usr/bin/python
#-*-coding:utf-8-*-

class person:
    #初始化类
    def __init__(self,name,age,pay=0,job=None):
        self.name = name
        self.age = age
        self.pay = pay
        self.job = job
    #类的方法/行为
    def lastname(self):
        return self.name.split()[-1]

    def giveraise(self,percent):
        self.pay *= (1 + float(percent))
    #重载
    def __str__(self):
        return '%s ==> %s'%(self.__class__.__name__,self.name)

创建一个继承类,继承上面的person

class manager(person):
    #自定义构造,预设job
    def __init__(self,name,age,pay):
        person.__init__(self,name,age,pay,'manager')

    def raise2(self,percent):
        self.pay *= (1.2 + float(percent))

使用刚才创建的类来创建对象,然后用shelve保存对象,以下分别展示了pickle和shelve的使用:

#!/usr/bin/python
#-*-coding:utf-8-*-

import pickle,shelve
from person import person
from manager import manager

bob = person('Bob',40,5000,'software')
jack = person('Jack',42,7000,'hardware')
mike = manager('Mick',45,8000,)

#pickle存储单个对象,需指定打开方式'wb'(写),'rb'(读)
with open('test.pkl','wb') as db:
    pickle.dump(bob,db)

#使用shelve存储多个对象
db = shelve.open('test')
db['jack'] = jack
db['mike'] = mike
db['bob'] = bob
db.close()

#使用上下文方法
with shelve.open('my_db') as db:
    db['bob'] = bob
    db['jack'] = jack
    db['mike'] = mike

db_read = shelve.open('my_db')
for key in db_read:
    print(key,'==>\n',db_read[key])
db_read.close()

################查询功能###########
fieldnames = ('name','age','pay','job')     #需要读取的数据关键词
maxfield = max(len(f) for f in fieldnames)  #获取长度
catch_db = shelve.open('my_db')             #打开数据
while True:
    key = input('\nkey=? => ')              #获取输入
    if not key:break                        #空格或回车就break
    try:
        record = catch_db[key]              #尝试匹配
    except:
        print('no suck key like %s'%key)
    else:
        for field in fieldnames:            #用getattr方法获取record的属性
            print(field.ljust(maxfield),'=>',getattr(record,field))
catch_db.close()

增加一个修改功能

################修改功能###########
fieldnames = ('name','age','pay','job')
with shelve.open('./selve_bak/my_db') as edit_db:
    while True:
        key = input('\nkey =>? ')
        if not key:break
        if key in edit_db:                      #如果记录存在,则提取对应的记录
            record = edit_db[key]
            while True:
                print('Enter which want to change(name,age,pay,job) ?')
                edit_part = input()
                if not edit_part:break
                if edit_part in fieldnames:
                    newvalue = input('%s new value => '%edit_part)
                    setattr(record,edit_part,newvalue)
        else:
            record = person(name='?',age='?',pay='?',job='?')
        for field in fieldnames:                #修改对应的属性
            currval = getattr(record,field)     #获取原有记录的属性
            #对象的属性修改值放在变量currval中
            newtext = input('\t[%s] = %s\n\t\tnew?=>'%(field,currval))
            #如果有修改,则使用setattr方法修改对应的属性,eval必须明确使用''引号括起字符串
            #如果此时不修改,直接按回车跳过则不会修改原有值
            if newtext:
                setattr(record,field,eval(newtext))
        edit_db[key] = record   #将修改后的对象添加进去

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值