首页 > 编程语言 >Python基础之面向对象:4、super方法实战

Python基础之面向对象:4、super方法实战

时间:2022-11-07 18:55:37浏览次数:31  
标签:Python 方法 +-------------------+---------------+ datetime 面向对象 json 序列化 super

派生方法实战

​ 以上我们学习了通过super()的方法可以重写父类、额外添加父类中的数据,下面将通过实战案例来讲述super()方法来重写、添加父类中的功能代码

需求:

1、使用json格式,序列化字典d
d = {
    't1': datetime.date.today(),
    't2': datetime.datetime.today(),
    't3': 'jason'
}

2、若直接使用json内置方法将会报错
"""
序列化报错
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type date is not JSON serializable
"""
"""
能够被序列化的数据是有限的>>>:里里外外都必须是下列左边的类型
    +-------------------+---------------+
    | Python            | JSON          |
    +===================+===============+
    | dict              | object        |
    +-------------------+---------------+
    | list, tuple       | array         |
    +-------------------+---------------+
    | str               | string        |
    +-------------------+---------------+
    | int, float        | number        |
    +-------------------+---------------+
    | True              | true          |
    +-------------------+---------------+
    | False             | false         |
    +-------------------+---------------+
    | None              | null          |
    +-------------------+---------------+
"""

方式一:

​ 直接将字典内datetime格式数据强行转换成字符串格式

d = {
     't1': str(datetime.date.today()),
     't2': str(datetime.datetime.today())
 }
 res = json.dumps(d)
 print(res)

方式二:

​ 使用super()方法,重写json方法,达到序列化的目的

"""
查看dumps源码 注意cls参数 默认传JsonEncoder
查看该类的源码 发现default方法是报错的发起者
编写类继承JsonEncoder并重写default方法 之后调用dumps手动传cls=我们自己写的类
"""

class MyJsonEncoder(json.JSONEncoder):
    def default(self, o):
        """
        :param o: 接收无法被序列化的数据
        :return: 返回可以被序列化的数据
        """
        if isinstance(o, datetime.datetime):  # 判断是否是datetime类型 如果是则处理成可以被序列化的类型
            return o.strftime('%Y-%m-%d %X')
        elif isinstance(o, datetime.date):
            return o.strftime('%Y-%m-%d')
        return super().default(o)  # 最后还是调用原来的方法 防止有一些额外操作没有做


res = json.dumps(d, cls=MyJsonEncoder)
print(res)

标签:Python,方法,+-------------------+---------------+,datetime,面向对象,json,序列化,super
From: https://www.cnblogs.com/kangssssh/p/16867023.html

相关文章

  • 面向对象封装/多态/反射
    内容概要派生方法实战面向对象三大特性之封装三大特性之多态面向对象之反射反射实战案例练习题派生方法实战派生方法实战案例:importjsonimportdatetime#......
  • Python——面向对象(封装、多态、反射)
    Python——面向对象派生方法实战#coding:utf-8importjsonimportdatetime#dict_demo={#'t1':datetime.date.today(),#'t2':datetime.datetime.to......
  • Python decorator
    此处只做标记,没有深入更深层次了解!!!初步的了解,是decorator库可以通过注解的方式扩展方法,扩展是在不改变原有函数的情况下进行的,如下图所示:    另外,网上也看到一些......
  • Python Colorama
    此处借用CSND上的一篇博文作为使用说明,连接为:https://blog.csdn.net/qq_23845779/article/details/105991806该库的主要作用就是用来改变命令行或者控制台输出文字色彩的,......
  • Python获取MySQL的创建表sql到文件中
    importosimportpymysqlpath=r'D:\Projects\sql'ifnotos.path.isdir(path):os.mkdir(path)conn=pymysql.connect(host='192.168.1.17',user='root',......
  • Python基础28
    今日内容概要派生方法实战演练面向对象三大特性之封装面向对象三大特性之多态面向对象之反射反射的实战案例今日内容详细派生方法实战演练importjsonimportda......
  • 面向对象3之封装多态映射
    目录派生方法实战演练面向对象三大特性之封装伪装三大特性之多态面向对象之反射反射实战案例派生方法实战演练importjsonimportdatetimed={'t1':datetime.da......
  • 面向对象之派生方法、封装、伪装、三大特性、反射
    面向对象之派生方法、封装、伪装、三大特性、反射派生方法实战演练什么是派生方法?子类中的定义方法和父类定义方法一模一样的方法,并且扩展了新功能(子类和父类一样,但是......
  • python3-环境篇-03-pycharm创建python工程之hello word
     1.打开pycharm,点击【NewProject】​编辑修改【location】,选择【BaseInterpreter】 编辑选择编辑工程创建成功编辑 右击工程,选择【new】编辑创建hello文件编辑编写输......
  • python监听鼠标键盘
    https://blog.csdn.net/Jason_WangYing/article/details/114155511 #-*-encoding:utf-8-*-importtimeimportpyautoguiaspagimportkeyboard#https:/......