派生方法實戰
? 以上我們學習了通過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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/530004.html
標籤:面向對象