web開發中有這么一個場景,我們從數據庫中查詢某一數據的時候,往往需要對數據進行一些轉化之后才能傳給前端。
當然我們可以根據查詢出來的實例對象,構建一個dict返回,這樣會導致我們的代碼非常的臃腫。但是這也確實是一種最直接的方式。
除此之外我們來看另外一種方式。
調用類的__dict__函數將類的一些屬性轉化字典進行序列化
import json
class UserTest:# 類變量name = "hou"age = 18# 實例變量def __init__(self):self.nickname = "user1"user = UserTest()
print(json.dumps(user))
# 直接序列化一個對象是會報錯的
# TypeError: Object of type UserTest is not JSON serializabledct = user.__dict__
print(json.dumps(dct))
{"nickname": "user1"}
此時你會看到類變量通過__dict__函數是不會被轉化字典從而被序列化的。
如果我們想要將類變量也轉化為字典從而被序列化那要怎么辦呢?
此時你需要重寫這兩個函數def keys(self)
和def __getitem__(self, item)
class User:name = "hou"age = 18def __init__(self):self.nickname = "user1"def keys(self):# keys函數可以通過dict(self)返回對象構建字典的key集合# 重寫keys函數,類的屬性也可以通過dict的形式進行訪問# 返回值必須是一個可迭代的對象return ("name", "age", "nickname")def __getitem__(self, item):# 根據item獲取對象屬性的值return getattr(self, item)user = User()
print(user.name) # 對象.屬性訪問
print(user["name"]) # 字典形式訪問
print(user["age"])
print(user["nickname"])# dict在傳入對象實例的時候會嘗試構建字典
# 通過對象的keys獲取對象的鍵值,__getitem__獲取對象屬性的值
dct = dict(user)
print(dct)
# {'name': 'hou', 'age': 18, 'nickname': 'user1'}
此時還有一個問題,如果我們只想通過dict(對象)返回特定的屬性如何操作呢?
此時只要在keys
函數中指定返回的集合即可。
class User:name = "hou"age = 18def __init__(self):self.nickname = "user1"def keys(self):return ("name", "nickname")def __getitem__(self, item):return getattr(self, item)user = User()
dct = dict(user)
print(dct)
# {'name': 'hou', 'nickname': 'user1'}
如果一個類的屬性比較多,我們只想根據傳參的集合來構架字典從而序列化如何做呢?
我們只需要在類實例化的時候指定keys
需要返回的字段即可。
class User:name = "hou"age = 18def __init__(self):self.nickname1 = "user1"self.nickname2 = "user2"self.nickname3 = "user3"self.nickname4 = "user4"self.nickname5 = "user5"# self.fields = ["name", "age", "nickname1", "nickname2", "nickname3", "nickname4", "nickname5"]self.fields = []def keys(self):return self.fieldsdef __getitem__(self, item):return getattr(self, item)def to_dict(self, *keys):for key in keys:self.fields.append(key)user = User()
user.to_dict("nickname1", "nickname3")
dct = dict(user)
print(dct)
# {'nickname1': 'user1', 'nickname3': 'user3'}