将类属性反向映射到Python中的类

wxs*_*wxs 0 python metaclass

我在Python中有一些代码,我将有一堆类,每个类都有一个属性_internal_attribute.我希望能够生成这些属性到原始类的映射.基本上我希望能够这样做:

class A(object):
    _internal_attribute = 'A attribute'
class B(object):
    _internal_attribute = 'B attribute'

a_instance = magic_reverse_mapping['A attribute']()
b_instance = magic_reverse_mapping['B attribute']()
Run Code Online (Sandbox Code Playgroud)

我在这里缺少的是如何生成magic_reverse_mapping字典.我有一种直觉,有一个元类产生A和B是正确的方法来解决这个问题; 那似乎对吗?

sth*_*sth 5

可以使用元类自动注册您的类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']()
Run Code Online (Sandbox Code Playgroud)

或者,您可以在类上使用装饰器来注册它们.我认为这更易读,更容易理解:

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']()
Run Code Online (Sandbox Code Playgroud)

或者你甚至可以手工完成.没有使用任何魔法,这不是更多的工作:

reverse_mapping = {}

class A(object):
    _internal_attribute = 'A attribute'

reverse_mapping[A._internal_attribute] = A
Run Code Online (Sandbox Code Playgroud)

看看不同的变体,我认为装饰器版本将是最令人愉快的使用.