#!/usr/bin/env python from dataclasses import dataclass def validate_positive(name, value): '''eine einfache Validierungsfunktion''' if value < 0: raise ValueError( f'The value for {name!r} must be positive, {value!r} is not.') class YearBetweenValidator: '''komplexerer Validator, beachte die magische Methode __call__''' def __init__(self, mini, maxi): self.mini, self.maxi = mini, maxi def __call__(self, name, value): if value > self.mini and value < self.maxi: return True raise ValueError(f'The value for {name!r} must be between {self.mini!r} and {self.maxi!r}, {value!r} is not.') class YearDesc: '''ein Deskriptor''' def __init__(self, type, validators=[]): self.type = type self.validators = validators def __set_name__(self, owner, name): self.name = name def __get__(self, obj, objtype=None): return getattr(self, self.name) def __set__(self, obj, value): if not isinstance(value, self.type): raise TypeError(f'The value for {self.name!r} must be a {self.type!r}, {value!r} is not.') for validate in self.validators: validate(self.name, value) setattr(self, self.name, value) @dataclass #(frozen=True) class Person: vorname: str nachname: str @dataclass #(frozen=True) class Student(Person): matriculation: int = YearDesc(int, [validate_positive]) @dataclass #(frozen=True) class Graduate(Student): graduation: int = YearDesc(int, [validate_positive, YearBetweenValidator(1990, 2020)]) if __name__ == '__main__': try: print(Person('Sheeva', 'Plug')) except Exception as e: print(str(e)) try: print(Student('Sheeva', 'Plug', 1991)) except Exception as e: print(str(e)) try: print(Graduate('Sheeva', 'Plug', 1991, 1995)) except Exception as e: print(str(e)) try: print(Graduate('Sheeva', 'Plug', 1991, '1995')) except Exception as e: print(str(e)) try: print(Graduate('Sheeva', 'Plug', 1991, -1995)) except Exception as e: print(str(e)) try: print(Graduate('Sheeva', 'Plug', 1989, 1989)) except Exception as e: print(str(e))