子类中的 Jsonpickle 更改数据类型
Jsonpickle in subclass changes data type
在我的一个项目中,我遇到了一个关于 jsonpickle
的奇怪问题,只要我 运行 它来自同一个文件,它就可以正常工作,但如果它来自 运行另一个 class 它将目标对象更改为字典。下面是简单的问题重构。我原来的class有点复杂,但问题是一样的。
P.S。问题 "disapears" 在 gui.py
我将 import data
更改为 from data import *
(使用其他代码重构)但我不确定为什么...
简单示例:
- data.py - 单独工作正常
import jsonpickle
from dataclasses import dataclass, field
from typing import List
@dataclass
class Car:
name: str
model: str
class CarsList(List):
# some other non important functions
def length(self):
return len(self)
class Company:
def __init__(self):
self.companyCars = CarsList()
self.loadData()
print(self.companyCars.length())
def loadData(self):
with open('cars.json', "r") as infile:
json_str = infile.read()
self.companyCars = jsonpickle.decode(json_str)
if __name__ == '__main__':
myCompany = Company() # works fine
- gui.py(不工作)
import data
class Gui:
def __init__(self):
self.myCompany = data.Company()
if __name__ == '__main__':
myGui = Gui() # Not working !
第二个文件returns错误:
Traceback (most recent call last):
File "/home/bart/costam/gui.py", line 15, in <module>
myGui = Gui() # Not working !
File "/home/bart/costam/gui.py", line 11, in __init__
self.myCompany = data.Company()
File "/home/bart/costam/data.py", line 40, in __init__
print(self.companyCars.length())
AttributeError: 'dict' object has no attribute 'length'
class 在全球范围内不可用,因此 jsonpickle
无法对其进行解码。
在 docs 中:
The object must be accessible globally via a module and must inherit from object (AKA new-style classes).
这也是为什么当您执行 from data import *
.
时出现 'disappears' 问题的原因
在我的一个项目中,我遇到了一个关于 jsonpickle
的奇怪问题,只要我 运行 它来自同一个文件,它就可以正常工作,但如果它来自 运行另一个 class 它将目标对象更改为字典。下面是简单的问题重构。我原来的class有点复杂,但问题是一样的。
P.S。问题 "disapears" 在 gui.py
我将 import data
更改为 from data import *
(使用其他代码重构)但我不确定为什么...
简单示例:
- data.py - 单独工作正常
import jsonpickle
from dataclasses import dataclass, field
from typing import List
@dataclass
class Car:
name: str
model: str
class CarsList(List):
# some other non important functions
def length(self):
return len(self)
class Company:
def __init__(self):
self.companyCars = CarsList()
self.loadData()
print(self.companyCars.length())
def loadData(self):
with open('cars.json', "r") as infile:
json_str = infile.read()
self.companyCars = jsonpickle.decode(json_str)
if __name__ == '__main__':
myCompany = Company() # works fine
- gui.py(不工作)
import data
class Gui:
def __init__(self):
self.myCompany = data.Company()
if __name__ == '__main__':
myGui = Gui() # Not working !
第二个文件returns错误:
Traceback (most recent call last):
File "/home/bart/costam/gui.py", line 15, in <module>
myGui = Gui() # Not working !
File "/home/bart/costam/gui.py", line 11, in __init__
self.myCompany = data.Company()
File "/home/bart/costam/data.py", line 40, in __init__
print(self.companyCars.length())
AttributeError: 'dict' object has no attribute 'length'
class 在全球范围内不可用,因此 jsonpickle
无法对其进行解码。
在 docs 中:
The object must be accessible globally via a module and must inherit from object (AKA new-style classes).
这也是为什么当您执行 from data import *
.