首页 > 编程语言 >python: 如何将方法对象和类实例对象序列化

python: 如何将方法对象和类实例对象序列化

时间:2024-06-06 20:01:11浏览次数:27  
标签:name person python self 对象 序列化 pickle age

文章目录

1. Json序列化

  • 在python中对于一般数据的序列化保存经常使用的就是json序列化
  • json序列化可序列的对象: 一般数据类型列表,字典,字符串,数字,布尔值,None等
json可以序列化的对象类型:
	基本数据类型:
		None
		布尔值:True, False
		数字:整数和浮点数
		字符串:str
	
	序列和映射类型:
		列表:list
		元组:tuple(会被转换为 JSON 数组)
		字典:dict
  • 那么自定义对象和函数方法可以通过json序列化吗?
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def greet(self):
        return f"Hello, my name is {self.name}"


person = Person("abc", 10)

with open("test.json", "w", encoding="utf-8", errors='ignore') as f:
    data = json.dumps(person)
    f.write(data)
# ==>报错 TypeError: Object of type Person is not JSON serializable
  • 所以如果想把类实例和方法序列化,使用json是不行的

2. Pickle序列化

-Pickle是Python标准库中的一个模块,用于将Python对象序列化(pickling)为二进制数据,以及从二进制数据反序列化(unpickling)为Python对象。这个模块对于在不同的Python程序之间传递数据或将数据存储到文件中非常有用。pickle模块支持几乎所有的Python对象,包括自定义对象,但不适用于存储与Python解释器状态相关的对象,如打开的文件、套接字连接等。
详细信息可点击链接参考

  • 在test1.py里面把对象序列化后放到本地文件test.pkl里面
  • 然后在test2,py反序列化test.pkl文件里面的数据,获取对象使用
# test1.py
import pickle

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def greet(self):
        return f"Hello, my name is {self.name}"


person = Person("abc", 10)

# 序列化
person_pickle = pickle.dumps({"person": person}) # person_pickle数据类型为二进制
with open("test.pkl", "wb") as f:
    f.write(person_pickle)
  • 以下会报错是因为py文件里面没有保存实例的类
# test2.py
import pickle

# 反序列化
with open("test.pkl", "rb") as f:
    data = pickle.loads(f.read())
print(data)
# 报错AttributeError: Can't get attribute 'Person' on <module '__main__' from 'D:\\text\\test2.py'>
  • 以下为正确的引用方式
# test2.py
import pickle


class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def greet(self):
        return f"Hello, my name is {self.name}"


# 反序列化
with open("test.pkl", "rb") as f:
    data = pickle.loads(f.read())
print(data)
# ==>{'person': <__main__.Person object at 0x000001CB1FE19E48>}

标签:name,person,python,self,对象,序列化,pickle,age
From: https://blog.csdn.net/qq_29371275/article/details/139500839

相关文章

  • python的datetime使用时区转换的注意事项
    由于做美股的开始,经常用到需要将utc时间转换成美东时间,或者美东时间转换为utc时间。美东时间涉及到一个夏令时,一个冬令时,不同的阶段与utc时间的时区相差不同的时间段 以前我一直用pytz的三方模块给datetime赋值时区信息,然后生成的对象用astimezone的方法,转换到对应的时区信息......
  • python --数据分析-numpy-pandas-series对象和dataframe对象
    Python作为当下最为流行的编程语言之一,可以独立完成数据分析的各种任务功能强大,在数据分析领域里有海量开源库,并持续更新是当下热点——机器学习/深度学习领域最热门的编程语言除数据分析领域外,在爬虫,Web开发等领域均有应用常用Python数据分析开源库介绍NumPyNumP......
  • 倒计时:日期对象.getTime();获取当前时间戳
    <!DOCTYPEhtml><htmllang="en"><head> <metacharset="UTF-8"> <title>Document</title></head><body> <h1></h1> <scripttype="text/javascript"> //现在到202......
  • 探索 CSV 模块:Python 中 CSV 数据持久化的最佳实践
    ......
  • Python-datetime
    importdatetimeprint("獲取當前時間和日期:",datetime.datetime.now())UtcNow=datetime.datetime.utcnow()print("獲取當前時間和日期的世界標準時間:",UtcNow)print("獲取日期:",UtcNow.date())print("獲取年:",UtcNow.year)print("獲取月:",Ut......
  • Python-GEE遥感云大数据分析、管理与可视化及多领域案例教程
    原文链接:Python-GEE遥感云大数据分析、管理与可视化及多领域案例教程https://mp.weixin.qq.com/s?__biz=MzUzNTczMDMxMg==&mid=2247606139&idx=3&sn=2b98c8d5c99878ce78c8fade559bdae5&chksm=fa821e9ccdf5978a7e63a1d514f2a643158a595fa75ac751c5ca477692bbc84e993245b342df&to......
  • 【Python Cookbook】S01E22 替换文本 re.sub(),re.subn() 以及 回调函数
    目录问题解决方案讨论问题如果我们想要对字符串中的文本做替换,该如何办?解决方案针对简单的文本模式,我们直接使用字符串内置方法str.replace()函数即可。text="Ileaveamessageforyou."print(text.replace('leave','left'))结果:Ileftamessagefor......
  • C# 使用Newtonsoft.Json的JsonProperty设置返回的Json数据列名/C# 通过实体类序列化生
    原文链接:https://blog.csdn.net/weixin_44917045/article/details/103236167         https://blog.csdn.net/bazinga_y/article/details/134416680在写分页的时候,返回Json数据给前台的时候,数据不能出来,原因就是Json数据的列名是大写的,而页面需要的是小写的。......
  • 【python】 文件操作
    【2024/6/6】文件刪除保持【解決】一般删除文件时使用os库,然后利用os.remove(path)即可完成删除,如果删除空文件夹则可使用os.removedirs(path)即可,但是如果需要删除整个文件夹,且文件夹非空时使用os.removedirs(path)就会报错了,此时可以使用shutil库,该库为python内置库,是一个对......
  • python 基础习题5 --- 海龟画图系列
    1.  画出一个半径为100的圆,背景色和画笔颜色自己定义,如下图:importturtleastt.speed(10)t.bgcolor("black")t.pencolor("red")t.pensize(2)radius=100t.penup()t.goto(0,-100)t.down()t.circle(radius)t.penup()t.done()答案 2. 用循环画出五个同......