python – 子类int允许“未知”值

我有点被困在这里.我基本上是在试验阶段,我想知道我是否可以继承int,这样它将完全像你的旧的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)

但是当我尝试将其实例化为uint(‘unknown’)时,此示例抛出ValueError:int()的无效文字,其中基数为10:’unknown’.

这可能吗?我该怎么办呢?

背景等级1

如果有人问,背景是我有一个可迭代的列表,我想用itertools.product创建一个新的.但之前,我想利用__len__,以防一些迭代器实现它,以便能够猜测(最小)最终元素的数量.所以就最终数字而言,对于那些没有__len__的迭代,我假设为1.

我想用类uint(int)执行此操作的原因是我希望能够安全地公开单独的计数(以便有人可以按下以下内容:“loading(1500 = 10 * 10 * unknown * 15)元素“仍然传递其中一些”未知“的信息.

背景等级2

我实际上是想象一种情况,当一个库提供这个类用于定义可迭代对象’__len__时,它们可以返回一个基于“最小”,“最大”或“最佳猜测”的数字,同时仍然没有被它在一些简单数学中的进一步使用所困扰.

>>> count = uint(100, 'minimum')
>>> print count
"minimum of 100"
>>> count * 20
2000
>>>

想象一个带有迭代器的对象,它读取一个巨大的文件:为什么对象不能说“好吧,文件是400 MiB,所以至少会有4,000条记录”?

所以一个额外的问题:什么更简单:继承int或创建一个新类,但必须实现和维护aritmethic操作的接口?

最佳答案 不完全确定为什么要这样做,但以下应该有效:

class uint(int):
    def __new__(cls, value):
        unknown = value == 'unknown'
        obj = super(uint, cls).__new__(cls, 1 if unknown else value)
        obj.unknown = unknown
        return obj

    def __str__(self):
        return 'unknown' if self.unknown else super(uint, self).__str__()

这里的想法是,不是将int值存储在名为self.value的属性中,而是使用您要使用的值来执行超类的实例化.

点赞