如何在python中设置默认(可重置)int

如何在python中设置默认(可重置)int,python,Python,我希望能够将整数/浮点重置为预定义的默认值,而不覆盖所有算术运算。差不多 class DefaultInt(int): def __init__(self, value): super(DefaultInt, self).__init__(value) self.default_value = value def reset(self): self.value = self.default_value my_int = DefaultInt(19) my_int +

我希望能够将整数/浮点重置为预定义的默认值,而不覆盖所有算术运算。差不多

class DefaultInt(int):

def __init__(self, value):
    super(DefaultInt, self).__init__(value)
    self.default_value = value

def reset(self):
    self.value = self.default_value

my_int = DefaultInt(19)
my_int += 1
my_int.reset()
但有两个问题:

  • 我无法通过子类化int类来访问隐藏的
    值本身
  • my_int+=1
    之后,
    my_int
    显然变成了一个简单的int

我认为,如果您只需要重置功能,您可以简单地使用:

default_value = 5
my_int = int.__new__(int, default_value)
my_int += 1
print my_int   #  prints 6
my_int = int.__new__(int, default_value)
print my_int   # prints 5

您眼前的问题:

就地添加需要您重新定义
\uuu iadd\uuu
(就地添加)以返回
DefaultInt
对象(最好保存默认值,否则它将成为新值)

正如您所写的那样,
reset
看起来不可能,因为整数是不可变的。但是您可以将
reset
的结果重新分配给相同的名称。那就行了

class DefaultInt(int):

    def __init__(self,value=0):
        super(DefaultInt, self).__init__()
        self.default_value = value

    def __iadd__(self,value):
        old_default = self.default_value
        r = DefaultInt(value + self)
        r.default_value = old_default
        return r

    def reset(self):
        return DefaultInt(self.default_value)

my_int = DefaultInt(19)
my_int += 1
print(my_int)
my_int = my_int.reset()
print(my_int)
输出:

20
19
你的长期问题:

但这是第一步。如果您尝试
my_int+12
,您将看到它也返回一个
int
:您必须定义
\uuuu添加
。这同样适用于
\uuuu sub\uuu
。。。还有一个“隐藏”值问题,一个不可改变的问题,它阻止您执行就地重置

结论:

我认为最好的方法不是继承
int
,而是使用所有为您的需要而精心设计的特殊方法(加上现在可以使用的
reset
方法)创建您自己的、可变的类。当重写
int
时,您将不会受到约束,代码也会更清晰,即使方法是详尽的(至少如果缺少一个方法,您会注意到它,而不是调用一个不合适的方法)