46讲最后一题
'''编写描述符 MyDes,使用文件来存储属性,属性的值会直接存储到对应的pickle(腌菜,还记得吗?)的文件中。如果属性被删除了,文件也会同时被删除,属性的名字也会被注销'''import pickle as p
import os
class MyDes:
def __init__(self,attr):
self.attr_name = attr
self.attr = attr
pickle_file =open(('D:\\python代码库\\属性值\\%s.pkl'% self.attr_name),'ab')
p.dump(self.attr,pickle_file)
pickle_file.close()
def __get__(self,instance,owner):
return self.attr
def __set__(self,instance,value):
'''保存属性的值写入到plk文件,但是无法正常写入文件,初次能写入,第二次写入无效,还是原来那样''
self.attr = value
pickle_file =open(('D:\\python代码库\\属性值\\%s.pkl' % self.attr_name),'ab') #打开属性对应的文件
p.dump(value, pickle_file)
pickle_file.close()
print('写入')
def __delete__(self,instance):
try:
os.remove('D:\\python代码库\\属性值\\%s.pkl' % self.attr_name)
del instance.x
except FileNotFoundError:
pass
class Test:
x = MyDes('x')
y = MyDes('y')
s = 123
t = Test()
del t.x
t.y = '123'
f = open("D:\\python代码库\\属性值\\y.pkl",'rb')
s = p.load(f)
print(s)
’问题:当我修改属性的值时候,读取pkl文件,文件内容并没有发生改变,求解‘’‘
init和set都用wb模式
def __set__(self,instance,value):
'''保存属性的值写入到plk文件,但是无法正常写入文件,初次能写入,第二次写入无效,还是原来那样''
self.attr = value
p.clear_memo() #加上这个试试
pickle_file =open(('D:\\python代码库\\属性值\\%s.pkl' % self.attr_name),'ab') #打开属性对应的文件
p.dump(value, pickle_file)
pickle_file.close()
print('写入') 笨鸟学飞 发表于 2020-11-11 13:58
def __set__(self,instance,value):
'''保存属性的值写入到plk文件,但是无法正常写入文件 ...
加了直接报错 suchocolate 发表于 2020-11-11 13:52
init和set都用wb模式
问题解决了,有个小疑惑为什么ab模式第二次写入无效 qin_yin 发表于 2020-11-11 14:09
问题解决了,有个小疑惑为什么ab模式第二次写入无效
我理解pickle存的是python原生对象,不能像写文本数据那样直接追加。
想追加得先读出数据,对数据操作后,再存入文件。 用这个验证一下追加:
import pickle
with open('test.pkl', 'wb') as f:
pickle.dump(, f)
with open('test.pkl', 'ab') as f:
pickle.dump(, f)
with open('test.pkl', 'rb') as f:
print(pickle.load(f))
页:
[1]