您可以使用元类在以下位置自动注册您的类magic_reverse_mapping
:
magic_reverse_mapping = {}
class MagicRegister(type):
def __new__(meta, name, bases, dict):
cls = type.__new__(meta, name, bases, dict)
magic_reverse_mapping[dict['_internal_attribute']] = cls
return cls
class A(object):
__metaclass__ = MagicRegister
_internal_attribute = 'A attribute'
afoo = magic_reverse_mapping['A attribute']()
或者,您可以在您的类上使用装饰器来注册它们。我认为这更具可读性和更容易理解:
magic_reverse_mapping = {}
def magic_register(cls):
magic_reverse_mapping[cls._internal_attribute] = cls
return cls
@magic_register
class A(object):
_internal_attribute = 'A attribute'
afoo = magic_reverse_mapping['A attribute']()
或者你甚至可以手工完成。在不使用任何魔法的情况下,这并不是更多的工作:
reverse_mapping = {}
class A(object):
_internal_attribute = 'A attribute'
reverse_mapping[A._internal_attribute] = A
查看不同的变体,我认为装饰器版本将是最令人愉快的使用。