首页 > 解决方案 > 如何创建一个扩展具有输入验证的“int”基类的类?

问题描述

我想创建一个扩展int基类的类,以便对象本身是一个整数(即您设置它并直接从中读取),但也有输入验证 - 例如,只允许给定范围。

根据我的研究,__init__扩展普通基类时不会调用该方法,因此我不确定如何执行此操作。我也不清楚您如何访问对象的值(即分配给它的实际整数)或从类中修改该值。我看到扩展任何基类(字符串、浮点数、元组、列表等)的相同问题。

如果我可以使用__init__它会是这样的:

class MyInt(int):
    def __init__(self, value):
        if value < 0 or value > 100:
            raise ValueError('MyInt objects must be in range 0-100, value was {}'.format(value))
        self = value

如何验证进入扩展 int 类的新值?

标签: pythonclassvalidationinheritancebase-class

解决方案


__new__在这种情况下,您实际上不必覆盖。对象创建后,__init__会被调用,你可以检查它是否在范围内。

class MyInt(int):
    def __init__(self, x, **kwargs):
        if self < 0 or self > 100:
            raise ValueError('MyInt objects must be in range 0-100, value was {}'.format(value))

您可以在返回新对象之前重写__new__以引发异常。MyInt(...)

class MyInt(int):
    def __new__(cls, *args, **kwargs):
        x = super().__new__(cls, *args, **kwargs)  # Let any value error propagate
        if x < 0 or x > 100:
            raise ValueError('MyInt objects must be in range 0-100, value was {}'.format(value))
        return x

您可能想在调用之前尝试验证参数super().__new__,但严格来说,这与其他类不兼容。


推荐阅读