python基础:类与对象,数据持久化
1,创建父类,子类继承
people.py: 父类
class people:
def __init__(self,name, age,job=None):
self.name=name
self.age=age
self.job=job
def getName(self):
return self.name
def setAge(self,age):
self.age=age
#创建对象
if __name__== "__main__":
p1=people("lisi",23,"spark-enginer")
p2=people("zs",43)
p1.setAge(34)
print(p1.getName())#lisi
print(p1.age)#34
peopleArr=[p1,p2]
#遍历方式1
# for per in peopleArr:
# print(per.name,per.age, per.job)
#遍历方式2
# tup3=[(per.name,per.age,per.job) for per in peopleArr]
# for info in tup3:
# print(info[0], info[1], info[2])
#遍历方式3:
# tup3=[(per.name,per.age, per.job) for per in peopleArr if per.age>30 ]
# for info in tup3:
# print(info[0], info[1], info[2])
#遍历方式4
ageArr=[(per.age+10 if per.age<30 else per.age) for per in peopleArr]
for age in ageArr:
print(age)#33, 43
子类 teacher.py: 继承父类
#继承people类
from chapter1.oop.people import people
class teacher(people):
#构造方法:重写父类构造
def __init__(self,name ,age):
people.__init__(self,name,age, job="teacher")
# def __init__(self,name): 构造方法,重载无效,只认参数少的
# people.__init__(self,name,30, job="teacher")
# 普通方法:重写父类普通方法
def getName(self):
return "teacher_"+self.name+", "+people.getName(self)
#重写toString方法:打印一个对象
def __str__(self):
return self.name+","+str(self.age)+","+self.job
#创建对象
t2=teacher("t2",43)
if __name__=="__main__":
#重写父类构造后, 必须使用以重写的构造方法,否则报错
# t1= teacher("t1",34,"Teacher")
# print(t1.getName())#teacher_t1
# print(t1)
print(t2.getName())
print(t2,1)
#teacher_t2, t2
#t2,43,teacher
2,对象的持久化
save_obj.py
#导入对象,保存到文件中
from chapter1.oop.class_obj.teacher import t2
import shelve
filename="data/shelve_obj"
def save_data():
#创建字典
dict=shelve.open(filename)
dict["obj"]=t2
#关闭字典
dict.close()
def read_data():
#创建字典
dict=shelve.open(filename)
for key in dict:
# print(key, ",", dict[key])#调用被重写的__str__方法: obj , t2,43,teacher
print(dict[key].name)#t2
print(dict[key].age)#43
print(dict[key].job)#teacher
print(dict[key].getName())#调用对象的方法
save_data()
read_data()
数据查询: interactive_select.py
#使用输入输出,循环: 进行交互
#通过shelve打开已保存的字典数据, input接收输入的key , 异常处理-获取数据-展示
import shelve
fileName="data/shelve_obj"
fieldNames=("name","age","job")
#数据
max_field_len=max(len(f) for f in fieldNames) #4
db=shelve.open(fileName)
while True:
key=input("请输入一个字典的key: [空格退出]")
#判断输入,进行处理
if not key :#空格,退出
break
try:
#打开字典
dict=shelve.open(fileName)
record=dict[key]
except:#出现异常
print("error...字典中不存在这个key(%s)" %key)
else:#没有异常
for field in fieldNames: #左对齐输出:属性-属性值
print(field.ljust(max_field_len), "===> ",getattr(record,field))
#请输入一个字典的key: obj
#name ===> t2
#age ===> 43
#job ===> teacher
数据更新,插入
interactive_test_update.py
#用输入的数据,更新文件中的数据
import shelve
from chapter1.oop.class_obj.teacher import teacher
fildNames=("name","age","job")
fileName="data/shelve_obj"
#读取数据
db=shelve.open(fileName)
while True:
#输入数据
key=input("输入字典的key ")
# 取出字典中的值, 更新
if not key : break
if key in db:
record=db[key]
else:
record=teacher(name='?',age='?')
#遍历所有所有属性, 取出属性值
for field in fildNames:
field_val=getattr(record, field)
fild_val_new=input("输入[%s] 的值: "%field)
if fild_val_new :#赋值
setattr(record, field,fild_val_new)
#保存数据
db[key]=record
db.close()
print("数据保存ok...")
测试:插入数据
查询验证:刚插入的数据