def at_time(time_of_day, _actions={}):
def decorator(func):
def wrapper(self, time_of_day):
for cls in type(self).__mro__:
if func := _actions.get((f'{cls.__qualname__}.{name}', time_of_day)):
return func(self)
raise ValueError(f'No {name} found in the {time_of_day} time')
name = func.__name__
_actions[func.__qualname__, time_of_day] = func
return wrapper
return decorator
class PersonalChef():
@at_time('morning')
def cook(self):
print("Cooking breakfast")
@at_time('evening')
def cook(self):
print("Cooking dinner")
class PersonalChefUK(PersonalChef):
@at_time('evening')
def cook(self):
print("Cooking supper")
PersonalChef().cook('morning')
PersonalChef().cook('evening')
PersonalChefUK().cook('morning')
PersonalChefUK().cook('evening')
ZGVmIGF0X3RpbWUodGltZV9vZl9kYXksIF9hY3Rpb25zPXt9KToKICAgIGRlZiBkZWNvcmF0b3IoZnVuYyk6CiAgICAgICAgZGVmIHdyYXBwZXIoc2VsZiwgdGltZV9vZl9kYXkpOgogICAgICAgICAgICBmb3IgY2xzIGluIHR5cGUoc2VsZikuX19tcm9fXzoKICAgICAgICAgICAgICAgIGlmIGZ1bmMgOj0gX2FjdGlvbnMuZ2V0KChmJ3tjbHMuX19xdWFsbmFtZV9ffS57bmFtZX0nLCB0aW1lX29mX2RheSkpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jKHNlbGYpCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZidObyB7bmFtZX0gZm91bmQgaW4gdGhlIHt0aW1lX29mX2RheX0gdGltZScpCiAgICAgICAgbmFtZSA9IGZ1bmMuX19uYW1lX18KICAgICAgICBfYWN0aW9uc1tmdW5jLl9fcXVhbG5hbWVfXywgdGltZV9vZl9kYXldID0gZnVuYwogICAgICAgIHJldHVybiB3cmFwcGVyCiAgICByZXR1cm4gZGVjb3JhdG9yCgpjbGFzcyBQZXJzb25hbENoZWYoKToKICAgIEBhdF90aW1lKCdtb3JuaW5nJykKICAgIGRlZiBjb29rKHNlbGYpOgogICAgICAgIHByaW50KCJDb29raW5nIGJyZWFrZmFzdCIpCgogICAgQGF0X3RpbWUoJ2V2ZW5pbmcnKQogICAgZGVmIGNvb2soc2VsZik6CiAgICAgICAgcHJpbnQoIkNvb2tpbmcgZGlubmVyIikKCmNsYXNzIFBlcnNvbmFsQ2hlZlVLKFBlcnNvbmFsQ2hlZik6CiAgICBAYXRfdGltZSgnZXZlbmluZycpCiAgICBkZWYgY29vayhzZWxmKToKICAgICAgICBwcmludCgiQ29va2luZyBzdXBwZXIiKQoKUGVyc29uYWxDaGVmKCkuY29vaygnbW9ybmluZycpClBlcnNvbmFsQ2hlZigpLmNvb2soJ2V2ZW5pbmcnKQpQZXJzb25hbENoZWZVSygpLmNvb2soJ21vcm5pbmcnKQpQZXJzb25hbENoZWZVSygpLmNvb2soJ2V2ZW5pbmcnKQ==