所以我遇到了一個我不知道如何解決的問題。
我想從 JSON 檔案加載物件并將它們轉換為 python 中的特定物件。例如,我得到了一些這樣的 JSON:
{
"Class1":{
"name":"str",
"value":float,
"description":"str",
etc.
},
"Class2":{
"name":"str",
"value":float,
"description":"str"
}
}
還有一些像這樣的 Python 代碼:
class Class1:
name:str
value:float
description:str
class Class2(Class1):
def someMethod(self):
pass
我怎樣才能在它所屬的班級中以最簡單的方式改變它?
我已經在網上找到了一些解決方案,但它們需要為每個類使用自定義編碼器。但我想要類似一個創建所有物件的函式的東西。
uj5u.com熱心網友回復:
資料類應該做的作業。資料類的建構式可以輕松處理資料。
from dataclasses import dataclass
@dataclass
class Class1:
name:str
value:float
description:str
@dataclass
class Class2(Class1):
def someMethod(self):
pass
data ={
"Class1":{
"name":"str",
"value":1.0,
"description":"str",
},
"Class2":{
"name":"str",
"value":2.0,
"description":"str"
}
}
for k, vals in data.items():
print(locals()[k](**vals))
# Class1(name='str', value=1.0, description='str')
# Class2(name='str', value=2.0, description='str')
uj5u.com熱心網友回復:
您可以使用dataclassesGlauco 已經提到的方法。如果您打算以您提到的樣式從 json 生成它們,下面是一個示例方法。
from dataclasses import make_dataclass
from pydoc import locate
definitions = {
"Class1": {
"name": "str",
"value": "float",
"description": "str",
},
"Class2": {
"name": "str",
"value": "float",
"description": "str"
}
}
def make_class(name, definition):
def_fields = [(name, locate(typ)) for name, typ in definition.items()]
return make_dataclass(name, def_fields)
classes = [make_class(name, definition) for name, definition in definitions.items()]
uj5u.com熱心網友回復:
使用資料類
from dataclasses import dataclass
data = {
"clazz_1":{
"name":"jack",
"value":12.5,
"description":"desc1",
},
"clazz_2":{
"name":"jim",
"value":45.77,
"description":"desc2"
}
}
@dataclass
class A:
name:str
value: float
description: str
@dataclass
class B:
name:str
value: float
description: str
@dataclass
class Parent:
clazz_1: A
clazz_2: B
p: Parent = Parent(**data)
print(p)
輸出
Parent(clazz_1={'name': 'jack', 'value': 12.5, 'description': 'desc1'}, clazz_2={'name': 'jim', 'value': 45.77, 'description': 'desc2'})
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/381564.html
