我有点卡在这里。我基本上处于试验阶段,我想知道我是否可以进行子类化int
,以便它完全像你的好 old 一样int
,除了你将能够分配一个“未知”值,在算术运算的情况下,它将作为 1 .
所以我可以说:
>>> uint(5) + 5
10
>>> uint('unknown')
unknown
>>> int(uint('unknown'))
1
>>> uint('unknown') + 5
6
>>>
事实上,它在某种程度上类似于已经使用的东西float('inf')
,除了我只需要整数加上单个“特殊”值。
我想象的工作将是这样的:
class uint(int):
def __init__(self, value):
self.value = value
self.unknown = self.value == "unknown"
def __int__(self):
return 1 if self.unknown else self.value
def __str__(self):
return "unknown" if self.unknown else str(self.value)
但是ValueError: invalid literal for int() with base 10: 'unknown'
当我尝试将它实例化为uint('unknown')
.
那么这可能吗?我该怎么做呢?
背景级别 1
如果有人问,背景是我有一个可迭代列表,我想使用itertools.product
. 但在此之前,我想利用__len__
,以防某些迭代器实现它,以便能够猜测(最小)最终元素的数量。因此,就最终数字而言,对于那些没有 的迭代__len__
,我假设为 1。
我想要这样做的原因class uint(int)
是我希望能够安全地公开单独的计数(以便有人可以推送类似的日志:“加载(1500 = 10 * 10 * 未知 * 15)元素”并且仍然通过关于其中一些是“未知”的信息。
背景等级 2
我实际上很喜欢当库提供此类用于定义可迭代对象'时的情况__len__
,以便它们可以返回基于“最小值”、“最大值”或“最佳猜测”的数字,而仍然不是被它在一些简单的数学中的进一步使用所困扰。
>>> count = uint(100, 'minimum')
>>> print count
"minimum of 100"
>>> count * 20
2000
>>>
想象一个带有读取一个大文件的迭代器的对象:为什么该对象不能说“好吧,文件是 400 MiB,所以至少会有 4,000 条记录”?
所以一个额外的问题:什么更简单:继承 int 或创建一个新类,但必须实现和维护算术运算的接口?