fork download
  1. class at_time:
  2. actions = {}
  3.  
  4. def __init__(self, time_of_day):
  5. self.time_of_day = time_of_day
  6.  
  7. def __call__(self, func):
  8. self.actions.setdefault(func.__qualname__, {})[self.time_of_day] = func
  9. return self
  10.  
  11. def __set_name__(self, owner, name):
  12. self.name = name
  13. for time_of_day, func in self.actions.pop(
  14. '.'.join((owner.__qualname__, name))).items():
  15. setattr(owner, f'_{name}_{time_of_day}', func)
  16.  
  17. def __get__(self, obj, objtype):
  18. def wrapper(time_of_day):
  19. try:
  20. return getattr(obj, f'_{self.name}_{time_of_day}')()
  21. except AttributeError:
  22. raise ValueError(f'No {self.name} found in the {time_of_day} time')
  23. return wrapper
  24.  
  25. class PersonalChef():
  26. @at_time('morning')
  27. def cook(self):
  28. print("Cooking breakfast")
  29.  
  30. @at_time('evening')
  31. def cook(self):
  32. print("Cooking dinner")
  33.  
  34. class PersonalChefUK(PersonalChef):
  35. @at_time('evening')
  36. def cook(self):
  37. print("Cooking supper")
  38.  
  39. PersonalChef().cook('morning')
  40. PersonalChef().cook('evening')
  41. PersonalChefUK().cook('morning')
  42. PersonalChefUK().cook('evening')
Success #stdin #stdout 0.04s 9596KB
stdin
Standard input is empty
stdout
Cooking breakfast
Cooking dinner
Cooking breakfast
Cooking supper