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)) 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
这是求助还是楼主的解题活动
求助,我写了好几个都没法通过{:5_96:} ,好像涉及到的魔法方法是 __reduce__ hrpzcf 发表于 2022-4-16 14:20
你的通过了,请问大佬这两个魔法方法相关的资料在哪里可以看到,
我查了好久跟 __reduce__ 相关的资料都没有,更别说 __getstate__ 和 __setstate__ 了{:5_100:} hrpzcf 发表于 2022-4-15 21:17
我直接查 __getstate__ 和 __setstate__ 可以百度到了,
我一开始查跟序列化规则相关的资料啥也没查到,请问大佬是怎么知道要用这两个魔法方法的,
我还一直以为是用 __reduce__ 呢 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 hrpzcf 发表于 2022-4-16 14:32
我是在打断点时发现pickle获取了__reduce__/__reduce_ex__/__getstate__属性,去官网搜了一下文档:
htt ...
好的,谢谢大佬,你使用 pdb 来去调试的吗? isdkz 发表于 2022-4-16 14:33
好的,谢谢大佬,你使用 pdb 来去调试的吗?
就是vscode自带的调试器,我也不知道叫啥{:10_250:}
想着dumps的时候肯定要获取类的属性嘛,就在在Student里重写__getattribute__看看什么情况,然后就发现pickle获取这几个属性,官网已搜就发现文档了 hrpzcf 发表于 2022-4-16 14:38
就是vscode自带的调试器,我也不知道叫啥
想着dumps的时候肯定要获取类的属性嘛,就在在Stude ...
大佬,可以说一下你的 __getattrbute__ 里面是怎么写的吗?
我调试的时候按 F11 也只能看到表层,
没法看到更深层次的调用{:5_96:} 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))
hrpzcf 发表于 2022-4-16 15:29
我看到的也不是更深层的调用,就是单纯看name的值,能发现纯属意外
好的,谢谢大佬{:5_110:} isdkz 发表于 2022-4-16 15:37
好的,谢谢大佬
isdkz 也有求助的时候{:10_245:}
不过问题我都没看懂,好高级 同上
页:
[1]