qin_yin 发表于 2020-11-11 11:52:26

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文件,文件内容并没有发生改变,求解‘’‘

suchocolate 发表于 2020-11-11 13:52:11

init和set都用wb模式

笨鸟学飞 发表于 2020-11-11 13:58:56


    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('写入')

qin_yin 发表于 2020-11-11 14:05:57

笨鸟学飞 发表于 2020-11-11 13:58
def __set__(self,instance,value):
      '''保存属性的值写入到plk文件,但是无法正常写入文件 ...

加了直接报错

qin_yin 发表于 2020-11-11 14:09:43

suchocolate 发表于 2020-11-11 13:52
init和set都用wb模式

问题解决了,有个小疑惑为什么ab模式第二次写入无效

suchocolate 发表于 2020-11-11 20:54:07

qin_yin 发表于 2020-11-11 14:09
问题解决了,有个小疑惑为什么ab模式第二次写入无效

我理解pickle存的是python原生对象,不能像写文本数据那样直接追加。
想追加得先读出数据,对数据操作后,再存入文件。

suchocolate 发表于 2020-11-11 21:02:38

用这个验证一下追加:
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]
查看完整版本: 46讲最后一题