fork download
  1. class BaseRegistry:
  2. registered = {}
  3.  
  4. @classmethod
  5. def add(cls, name):
  6. def decorator(function):
  7. cls.registered[name] = function
  8. return function
  9.  
  10. return decorator
  11.  
  12. def __new__(cls, name):
  13. return cls.registered[name]
  14.  
  15. def __init_subclass__(cls):
  16. cls.registered = {}
  17.  
  18.  
  19. class RegistryOne(BaseRegistry):
  20. pass
  21.  
  22.  
  23. class RegistryTwo(BaseRegistry):
  24. pass
  25.  
  26.  
  27. @RegistryOne.add("the_one")
  28. class Example1:
  29. def __init__(self, scale_factor=1):
  30. self.scale_factor = scale_factor
  31.  
  32.  
  33. @RegistryOne.add("the_two")
  34. class Example2:
  35. def __init__(self, scale_factor=2):
  36. self.scale_factor = scale_factor
  37.  
  38.  
  39. if __name__ == "__main__":
  40. the_one = RegistryOne("the_one")()
  41. print(f"{the_one.scale_factor=}")
  42.  
  43. assert RegistryOne.registered != RegistryTwo.registered
Success #stdin #stdout 0.04s 9596KB
stdin
Standard input is empty
stdout
the_one.scale_factor=1