我有点卡在这里。我基本上处于试验阶段,我不知道我是否可以继承int
,以便它能够像您的好老int
一样行动,除了您将能够分配一个“未知”值,在算术运算的情况下,它将采取行动为1子类int允许“未知”值
所以,我可以说:
>>> 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
万一有人问,背景是,我有iterables的名单,我想创建一个使用itertools.product
新的。但之前,我想利用__len__
,以防某些迭代器实现它,以便能够猜出(最小)最终元素数量。所以在最后的数量而言,对于那些iterables不具备__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,所以会有至少4000条记录”?
所以一个奖金问题:什么更简单:子类化int或创建一个新的类,但必须实现和维护aritmethic操作接口?
为什么'1'?这背后的语义是什么?另外,这与“int”字段也可以是“None”不同? –
如果您正在寻找处理未知的一组观测值的方法,那么有许多标准方法可以处理。但那会是一个与你所问的不同的问题。 – msw
我已经阅读了三次您添加的“背景”,它似乎没有让您的目标更明确。然而,“我应该子类int”更明显是“不”。无论你的“未知”是什么,它都会失败OO Design的“** is-a ** int”测试。 – msw