鱼C论坛

 找回密码
 立即注册
查看: 4453|回复: 13

[已解决]pickle 编程题

[复制链接]
发表于 2022-4-15 21:17:55 | 显示全部楼层 |阅读模式
50鱼币
本帖最后由 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))
最佳答案
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))

最佳答案

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-16 14:12:48 | 显示全部楼层
这是求助还是楼主的解题活动
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-16 14:20:34 | 显示全部楼层
hrpzcf 发表于 2022-4-16 14:12
这是求助还是楼主的解题活动


求助,我写了好几个都没法通过 ,好像涉及到的魔法方法是 __reduce__
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-16 14:25:08 | 显示全部楼层

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

我查了好久跟 __reduce__ 相关的资料都没有,更别说 __getstate__ 和 __setstate__ 了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-16 14:30:01 | 显示全部楼层


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

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

我还一直以为是用 __reduce__ 呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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. ... ickle#module-pickle

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
isdkz + 5 + 5 + 3 无条件支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

好的,谢谢大佬,你使用 pdb 来去调试的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-16 14:38:29 | 显示全部楼层
isdkz 发表于 2022-4-16 14:33
好的,谢谢大佬,你使用 pdb 来去调试的吗?

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

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
isdkz + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

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

没法看到更深层次的调用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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))

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
isdkz + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-16 15:37:11 | 显示全部楼层
hrpzcf 发表于 2022-4-16 15:29
我看到的也不是更深层的调用,就是单纯看name的值,能发现纯属意外

好的,谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-16 22:39:16 | 显示全部楼层
isdkz 发表于 2022-4-16 15:37
好的,谢谢大佬

isdkz 也有求助的时候
不过问题我都没看懂,好高级
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-17 07:17:19 From FishC Mobile | 显示全部楼层
同上
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-15 04:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表