From 530cba6953a069f2b073d85af7d8e10fe290c2fe Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Sat, 18 Nov 2023 15:41:12 -0600 Subject: [PATCH] ex 4.3 --- descrip.py | 12 ++++++++++++ validate.py | 35 +++++++++++++---------------------- 2 files changed, 25 insertions(+), 22 deletions(-) create mode 100644 descrip.py 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: