hello? 发表于 2022-7-25 00:15:49

小甲鱼课后作业46讲

import os
import pickle

class MyDes:
    saved = []

    def __init__(self, name = None):
      self.name = name
      self.filename = self.name + '.pkl'

    def __get__(self, instance, owner):
      if self.name not in MyDes.saved:
            raise AttributeError("%s 属性还没有赋值!" % self.name)

      with open(self.filename, 'rb') as f:
            value = pickle.load(f)

      return value

    def __set__(self, instance, value):
      with open(self.filename, 'wb') as f:
            pickle.dump(value, f)
            MyDes.saved.append(self.name)

    def __delete__(self, instance):
      os.remove(self.filename)
      MyDes.saved.remove(self.name)


这是小甲鱼46讲的课后作业:第046讲:魔法方法:描述符(Property的原理) | 课后测试题及答案
https://fishc.com.cn/thread-56591-1-1.html
(出处: 鱼C论坛)

这是我的输入:
class A:
    t=MyDes("hhh")

   
t_=A()
t_.t="hello"
t_.t
'hello'
MyDes.saved
['hhh']
t_.t="hihihi"
t_.t
'hihihi'
MyDes.saved
['hhh', 'hhh']

我就是将“hhh.pkl”里的内容换了,saved就有两个"hhh",是我的问题还是小甲鱼代码有漏洞{:10_243:}
请求大佬帮助

jackz007 发表于 2022-7-25 00:34:11

       pkl 是对象的映像文件,应该是不允许编辑的,你是如何替换 “hhh.pkl” 文件内容的?

hello? 发表于 2022-7-25 09:26:14

jackz007 发表于 2022-7-25 00:34
pkl 是对象的映像文件,应该是不允许编辑的,你是如何替换 “hhh.pkl” 文件内容的?

就相当于是文件名字没变,都是‘hhh.pkl’,不过我第一次将内容设置为“hello”(t_t=“hello”)
第二次重新设定(t_t="hihihi"),hhh.pkl里的内容就变了(hello=>hihihi)
是不是再次以“wb”打开相同文件会自动清空里面的内容,就像用“w”一样
open("***","w")

jackz007 发表于 2022-7-25 09:39:59

hello? 发表于 2022-7-25 09:26
就相当于是文件名字没变,都是‘hhh.pkl’,不过我第一次将内容设置为“hello”(t_t=“hello”)
第二次 ...

      是的,用 'w' 或 'wb' 打开任何文件都会导致这个文件被新建,文件的原有内容被永久清除。
页: [1]
查看完整版本: 小甲鱼课后作业46讲