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的属性中,而是使用您要使用的值来执行超类的实例化. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |