diff --git a/descrip.py b/descrip.py new file mode 100644 index 0000000..3281085 --- /dev/null +++ b/descrip.py @@ -0,0 +1,12 @@ +class Descriptor: + def __init__(self, name): + self.name = name + + def __get__(self, instance, cls): + print(f"{self.name}:__get__") + + def __set__(self, instance, value): + print(f"{self.name}:__set__ {value}") + + def __delete__(self, instance): + print(f"{self.name}:__delete__") diff --git a/validate.py b/validate.py index 643cb63..be8a788 100644 --- a/validate.py +++ b/validate.py @@ -1,8 +1,17 @@ class Validator: + def __init__(self, name=None): + self.name = name + @classmethod def check(cls, value): return value + def __set__(self, instance, value): + instance.__dict__[self.name] = self.check(value) + + def __set_name__(self, cls, name): + self.name = name + class Typed(Validator): expected_type = object @@ -55,8 +64,9 @@ class NonEmptyString(String, NonEmpty): class Stock: - _types = (str, int, float) - __slots__ = ["name", "_shares", "_price"] + name = String() + shares = PositiveInteger() + price = PositiveFloat() def __init__(self, name, shares, price): self.name = name @@ -77,31 +87,12 @@ class Stock: @classmethod def from_row(cls, row): - values = [func(val) for func, val in zip(cls._types, row)] - return cls(*values) + return cls(*row) @property def cost(self): return self.shares * self.price - @property - def shares(self): - return self._shares - - @shares.setter - def shares(self, value): - PositiveInteger.check(value) - self._shares = value - - @property - def price(self): - return self._price - - @price.setter - def price(self, value): - PositiveFloat.check(value) - self._price = value - def sell(self, num): self.shares -= num if self.shares < 0: