python - 如何创建一个扩展具有输入验证的“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 类的新值?
解决方案
__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__
,但严格来说,这与其他类不兼容。
推荐阅读
- java - 在计时器完成或取消后运行代码
- laravel - 我可以将 L6 Auth 脚手架作为纯粹的 API 与 tymon/jwt-auth 一起使用吗?
- ubuntu - 在其他目录执行脚本
- amazon-web-services - 如果尚未创建新的 SSM 参数,如何创建 AWS Cloud Formation 条件?
- spring-boot - 无法使用 keycloak 构建基于 spring 的项目进行身份验证
- heroku - 是否可以将应用程序从爱好“降级”为免费?
- javascript - SDK 更新后出现“firebase.auth 不是函数”错误
- fonts - Chanakya 字体 - 少数字符未呈现
- javascript - 如何在提交打印pdf之前编码以回显用户帖子值?
- python-3.x - 如何在python中调用远程对象上的方法?