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...")

测试:插入数据
在这里插入图片描述
查询验证:刚插入的数据
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/eyeofeagle/article/details/86766141