class BaseRegistry:
registered = {}
@classmethod
def add(cls, name):
def decorator(function):
cls.registered[name] = function
return function
return decorator
def __new__(cls, name):
return cls.registered[name]
def __init_subclass__(cls):
cls.registered = {}
class RegistryOne(BaseRegistry):
pass
class RegistryTwo(BaseRegistry):
pass
@RegistryOne.add("the_one")
class Example1:
def __init__(self, scale_factor=1):
self.scale_factor = scale_factor
@RegistryOne.add("the_two")
class Example2:
def __init__(self, scale_factor=2):
self.scale_factor = scale_factor
if __name__ == "__main__":
the_one = RegistryOne("the_one")()
print(f"{the_one.scale_factor=}")
assert RegistryOne.registered != RegistryTwo.registered
Y2xhc3MgQmFzZVJlZ2lzdHJ5OgogICAgcmVnaXN0ZXJlZCA9IHt9CgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgYWRkKGNscywgbmFtZSk6CiAgICAgICAgZGVmIGRlY29yYXRvcihmdW5jdGlvbik6CiAgICAgICAgICAgIGNscy5yZWdpc3RlcmVkW25hbWVdID0gZnVuY3Rpb24KICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uCgogICAgICAgIHJldHVybiBkZWNvcmF0b3IKCiAgICBkZWYgX19uZXdfXyhjbHMsIG5hbWUpOgogICAgICAgIHJldHVybiBjbHMucmVnaXN0ZXJlZFtuYW1lXQoKICAgIGRlZiBfX2luaXRfc3ViY2xhc3NfXyhjbHMpOgogICAgICAgIGNscy5yZWdpc3RlcmVkID0ge30KCgpjbGFzcyBSZWdpc3RyeU9uZShCYXNlUmVnaXN0cnkpOgogICAgcGFzcwoKCmNsYXNzIFJlZ2lzdHJ5VHdvKEJhc2VSZWdpc3RyeSk6CiAgICBwYXNzCgoKQFJlZ2lzdHJ5T25lLmFkZCgidGhlX29uZSIpCmNsYXNzIEV4YW1wbGUxOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNjYWxlX2ZhY3Rvcj0xKToKICAgICAgICBzZWxmLnNjYWxlX2ZhY3RvciA9IHNjYWxlX2ZhY3RvcgoKCkBSZWdpc3RyeU9uZS5hZGQoInRoZV90d28iKQpjbGFzcyBFeGFtcGxlMjoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzY2FsZV9mYWN0b3I9Mik6CiAgICAgICAgc2VsZi5zY2FsZV9mYWN0b3IgPSBzY2FsZV9mYWN0b3IKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgdGhlX29uZSA9IFJlZ2lzdHJ5T25lKCJ0aGVfb25lIikoKQogICAgcHJpbnQoZiJ7dGhlX29uZS5zY2FsZV9mYWN0b3I9fSIpCgogICAgYXNzZXJ0IFJlZ2lzdHJ5T25lLnJlZ2lzdGVyZWQgIT0gUmVnaXN0cnlUd28ucmVnaXN0ZXJlZA==