派生方法實戰 以上我們學習了通過super()的方法可以重寫父類、額外添加父類中的數據,下麵將通過實戰案例來講述super()方法來重寫、添加父類中的功能代碼 需求: 1、使用json格式,序列化字典d d = { 't1': datetime.date.today(), 't2': datet ...
派生方法實戰
以上我們學習了通過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)