我在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是正确的方法来解决这个问题; 那似乎对吗?
您可以使用元类自动注册您的类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)
看看不同的变体,我认为装饰器版本将是最令人愉快的使用.
| 归档时间: |
|
| 查看次数: |
316 次 |
| 最近记录: |