如何在python中设置default(resetable)int

2024-04-18 21:30:50 发布

您现在位置: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 += 1
my_int.reset()

但有两个问题:

  • 我不能通过子类化int类来访问隐藏的value本身。你知道吗
  • my_int += 1之后,my_int显然变成了一个简单的int

Tags: selfdefaultinitvaluemydef整数算术
2条回答

你眼前的问题:

就地加法需要重新定义__iadd__(就地加法)以返回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:您必须定义__add__。这同样适用于__sub__。。。还有一个“隐藏”值问题,还有一个不可变的问题,它阻止您执行就地reset。你知道吗

结论:

我认为最好的方法是不要继承int并创建自己的、可变的类,其中包含为您的需要而精心设计的所有特殊方法(加上现在可以工作的reset方法)。当重写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

相关问题 更多 >