У меня есть класс, который реализует атрибуты через @property
декоратора следующиммногоразовый класс Validating атрибуты
class num(object):
def __init__(self, value):
self.val = value
@property
def val(self):
return self._val
@val.setter
def val(self, value):
validation(self, (int, float), value, 0.0)
Когда значение атрибута должно быть установлено, оно должно получить проверенную.
def validation(obj, types, value, default):
"""Checks if the input provided for the attribute is valid."""
try:
if not isinstance(value, types):
obj._val = default
raise TypeError
if value < 0:
obj._val = default
raise ValueError
else:
obj._val = float(value)
except ValueError as e:
print("Should be a positive number. Value set at ", default)
except TypeError:
print("Should be a number. Value set at ", default)
Этот код работает для данного конкретного случая, когда у меня есть только один априори известный атрибут val
. Я хотел бы сделать функцию validation
более общей, чтобы иметь возможность использовать для других атрибутов (например, произвольный индекс). Я вижу, что моя проблема заключается в obj._val
, где я нарушаю инкапсуляцию.
Я думаю, что одним из возможных решений является использование декоратора метода, связанного с установщиком атрибута, или, возможно, передача дополнительного аргумента validation
, чтобы знать, какой атрибут должен быть проверен. Или, возможно, использует совершенно другой подход.
Заранее благодарен!
Почему ваш валидатор игнорирует «default»? –
@MartijnPieters ошибка в моем упрощенном тестовом коде. –