创建一个自定义的类
#!/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 #将修改后的对象添加进去