use*_*426 4 python class instance
创建类的实例时,如果给出了错误的参数。我怎么办?不创建一个新实例并返回引用,而是只返回一个“无”
这是我的应用程序:因为它有时被允许。我的应用程序是从整数列表构建树。我想在列表中使用 None 来表示一片叶子。所以我只想返回一个 None 而不是一个空的树节点。
这些答案大部分都不对。执行此操作的适当方法是在类的__new__方法中验证您的参数,并None在验证失败或ins验证成功时返回。
这就是你要找的:
import pytest # for testing
class ValidatedModel:
def __init__(self, *, name=None):
self.name = name
@classmethod
def _validate(cls, *args, **kwargs):
try:
assert not args
assert list(kwargs.keys()) == ['name']
assert len(kwargs['name']) > 5 and len(kwargs['name']) < 10
except AssertionError:
return False
return True
def __new__(cls, *args, **kwargs):
if cls._validate(*args, **kwargs):
return super().__new__(cls)
class TestValidatedModel:
def test_success(self):
vm = ValidatedModel(name='william')
assert isinstance(vm, ValidatedModel)
def test_kwarg_fail_unexpected_kwarg(self):
vm = ValidatedModel(name='william', gender='M')
assert vm is None
def test_kwarg_fail_name_length_short(self):
vm = ValidatedModel(name='bill')
assert vm is None
def test_kwarg_fail_name_length_long(self):
vm = ValidatedModel(name='william johnson')
assert vm is None
def test_no_name_kwarg(self):
vm = ValidatedModel()
assert vm is None
Run Code Online (Sandbox Code Playgroud)
显然,您可以用_validate自己的实现替换该方法。
请参阅Python return failure to create 的答案。__init__
基本上,您可以使用它__new__来完成您想要的事情,但实际上,执行此操作的 Python 方式是抛出异常。可以说,Pythonic 方法是有一个更简单的__init__方法,它只是一个初始化,并且根本不会失败。