isdkz 发表于 2022-4-15 21:17:55

pickle 编程题

本帖最后由 isdkz 于 2022-4-15 21:19 编辑

在下面的代码中,定义了一个类Student,并实现了构造方法和特殊方法__str__()、

__repr__()。函数 main() 接收一个 Student 类的对象 stu 作为参数,返回一个元组,

元组中有两个元素,分别为 pickle 对 stu 序列化的结果 stu_dumped 和 对 stu_dumped

反序列化的结果。要求为类 Student 增加新的特殊方法,使得 pickle 模块的函数 dumps() 对

类 Student 的对象 stu 进行序列化时,如果对象 stu 是女生,序列化得到的结果字节串

中不包含数据成员 age 的信息,如果对象 stu 是男生就在序列化时包含全部数据成员。

反序列化时,如果是男生就直接反序列化创建对象,如果是女生就把新对象的数据成员

age 设置为 18。

删除下面代码中的 pass,替换为自己的代码,完成要求的功能。

from pickle import dumps, loads

class Student:
    def __init__(self, username, sex, age):
      '''username为字符串,sex为'Female'或'Male',age为正整数'''
      self.username = username
      self.sex = sex
      self.age = age
    def __str__(self):
      return str(self.__dict__)
    __repr__ = __str__
   
    pass

def main(stu):
    stu_dummped = dumps(stu)
    return (stu_dummped, loads(stu_dummped))

hrpzcf 发表于 2022-4-15 21:17:56

from pickle import dumps, loads

class Student:
    def __init__(self, username, sex, age):
      '''username为字符串,sex为'Female'或'Male',age为正整数'''
      self.username = username
      self.sex = sex
      self.age = age
    def __str__(self):
      return str(self.__dict__)
    __repr__ = __str__
   
    def __getstate__(self):
      dic = self.__dict__.copy()
      if dic["sex"] == "Female":
            del dic["age"]
      return dic

    def __setstate__(self, state):
      self.__dict__.update(state)
      if (state["sex"] == "Female"):
            self.__dict__["age"] = 18

def main(stu):
    stu_dummped = dumps(stu)
    return (stu_dummped, loads(stu_dummped))

# s1 = Student("abc", "Male", 20)
# s2 = Student("def", "Female", 20)
# print(main(s2))

hrpzcf 发表于 2022-4-16 14:12:48

这是求助还是楼主的解题活动

isdkz 发表于 2022-4-16 14:20:34

hrpzcf 发表于 2022-4-16 14:12
这是求助还是楼主的解题活动

求助,我写了好几个都没法通过{:5_96:} ,好像涉及到的魔法方法是 __reduce__

isdkz 发表于 2022-4-16 14:25:08

hrpzcf 发表于 2022-4-16 14:20


你的通过了,请问大佬这两个魔法方法相关的资料在哪里可以看到,

我查了好久跟 __reduce__ 相关的资料都没有,更别说 __getstate__ 和 __setstate__ 了{:5_100:}

isdkz 发表于 2022-4-16 14:30:01

hrpzcf 发表于 2022-4-15 21:17


我直接查 __getstate__ 和 __setstate__ 可以百度到了,

我一开始查跟序列化规则相关的资料啥也没查到,请问大佬是怎么知道要用这两个魔法方法的,

我还一直以为是用 __reduce__ 呢

hrpzcf 发表于 2022-4-16 14:32:01

isdkz 发表于 2022-4-16 14:25
你的通过了,请问大佬这两个魔法方法相关的资料在哪里可以看到,

我查了好久跟 __reduce__ 相关的资料 ...

我是在打断点时发现pickle获取了__reduce__/__reduce_ex__/__getstate__属性,去官网搜了一下文档:
https://docs.python.org/zh-cn/3.7/library/pickle.html?highlight=pickle#module-pickle

isdkz 发表于 2022-4-16 14:33:55

hrpzcf 发表于 2022-4-16 14:32
我是在打断点时发现pickle获取了__reduce__/__reduce_ex__/__getstate__属性,去官网搜了一下文档:
htt ...

好的,谢谢大佬,你使用 pdb 来去调试的吗?

hrpzcf 发表于 2022-4-16 14:38:29

isdkz 发表于 2022-4-16 14:33
好的,谢谢大佬,你使用 pdb 来去调试的吗?

就是vscode自带的调试器,我也不知道叫啥{:10_250:}
想着dumps的时候肯定要获取类的属性嘛,就在在Student里重写__getattribute__看看什么情况,然后就发现pickle获取这几个属性,官网已搜就发现文档了

isdkz 发表于 2022-4-16 15:11:55

hrpzcf 发表于 2022-4-16 14:38
就是vscode自带的调试器,我也不知道叫啥
想着dumps的时候肯定要获取类的属性嘛,就在在Stude ...

大佬,可以说一下你的 __getattrbute__ 里面是怎么写的吗?

我调试的时候按 F11 也只能看到表层,

没法看到更深层次的调用{:5_96:}

hrpzcf 发表于 2022-4-16 15:29:33

isdkz 发表于 2022-4-16 15:11
大佬,可以说一下你的 __getattrbute__ 里面是怎么写的吗?

我调试的时候按 F11 也只能看到表层,


我看到的也不是更深层的调用,就是单纯看name的值,能发现纯属意外
from pickle import dumps, loads


class Student:
    def __init__(self, username, sex, age):
      """username为字符串,sex为'Female'或'Male',age为正整数"""
      self.username = username
      self.sex = sex
      self.age = age

    def __str__(self):
      return str(self.__dict__)

    __repr__ = __str__

    def __getstate__(self):
      dic = self.__dict__.copy()
      if dic["sex"] == "Female":
            del dic["age"]
      return dic

    def __setstate__(self, state):
      self.__dict__.update(state)
      if state["sex"] == "Female":
            self.__dict__["age"] = 18

    def __getattribute__(self, name):
      return super().__getattribute__(name)


def main(stu):
    stu_dummped = dumps(stu)
    return (stu_dummped, loads(stu_dummped))


s2 = Student("def", "Female", 20)
print(main(s2))


isdkz 发表于 2022-4-16 15:37:11

hrpzcf 发表于 2022-4-16 15:29
我看到的也不是更深层的调用,就是单纯看name的值,能发现纯属意外

好的,谢谢大佬{:5_110:}

歌者文明清理员 发表于 2023-3-16 22:39:16

isdkz 发表于 2022-4-16 15:37
好的,谢谢大佬

isdkz 也有求助的时候{:10_245:}
不过问题我都没看懂,好高级

liuhongrun2022 发表于 2023-3-17 07:17:19

同上
页: [1]
查看完整版本: pickle 编程题