我正在尝试创建int
的子类,该子类打印为字符串,但仍可用作数学变量。
这是我到目前为止所拥有的:
class xint(int):
def __new__(self, value):
self.value = value
return super(xint, self).__new__(self)
def __str__(self):
return f"'{self.value}'"
__repr__ = __str__
def __eq__(self, other):
return self.value == other
使用此功能,我可以做:
x = xint(2)
x = [x]
print(x)
>> ['2']
这是我想要的行为。但是我遇到的问题是,如果我尝试将此列表转换为JSON字符串,那么我会得到['2']
而不是[0]
。
import json
x = xint(2)
x = [x]
x = json.dumps(x)
print(x)
>> [0]
除了__repr__
和__str__
之外,还缺少某种方法来解决此问题吗?
此示例解决了您的错误,但不能解决您的问题:
import json
class Xint(int):
def __str__(self):
return f"'{int(self)}'"
# I'm leaving this in, but I think it's wrong
# a representation like f'Xint({int(self)})' would be better
__repr__ = __str__
x = Xint(2)
y = [x]
print(x)
print(json.dumps(y))
结果:
'2'
[2]
注意json.dumps()
现在如何正确显示您的2
。但是它仍然没有像print()
那样显示引号。这是因为json
识别要求转储的变量的类型,而它只是int
。
如果需要,您需要说服json
实际上只是一个字符串,或者说json
将作为字符串添加到转储中的某种类型。但这几乎会破坏您可能想到的其他用途。
我认为真正的问题是XY问题。不用问如何使您的解决方案有效,您也许可以与新类型一起分享要解决的问题?