2011-10-04 13 views
3

我有一个基类和几个子类。每个子类有所谓的“正则表达式”包含字符串的属性:将所有子类组织成Python中的字典的好方法?

# module level dictionary 
action_types = {} 

class Action(): 
    regex = '.*' 

    @classmethod 
    def register_action(cls): 
     action_types[cls.regex] = cls 


class Sing(Action): 
    regex = r'^SING [0-9]+' 
    Sing.register_action() 

class Dance(Action): 
    regex = r'^DANCE [0-9]+' 
    Dance.register_action() 

我要注册在ACTION_TYPES的所有子类字典使用每个班正则表达式作为重点。我希望逻辑将类注册为基类。

上面的例子不起作用,我相信这是因为舞蹈和唱变量在名称空间使用时尚不可用。

有没有办法在类初始化期间注册字典中的子类?

+0

你为什么要使用单独的类呢?使正则表达式成为实例成员和Sing,Dance等实例有什么不对? –

+0

实际上,我希望Sing和Dance类具有独特的__init__函数。我认为使用类似于Ignacio提供的示例中的元类模式实际上提供了两种最好的方式 - 子类是实例,但也可以具有唯一的初始化函数。 –

回答

7

这不是你想要做到的。

class ActionRegistry(type): 
    registry = {} 
    def __init__(cls, name, bases, dic): 
    if 'regex' in dic: 
     cls.registry[dic['regex']] = cls 
    super(ActionRegistry, cls).__init__(name, bases, dic) 

class Action(object): 
    __metaclass__ = ActionRegistry 

class Sing(Action): 
    regex = r'^SING [0-9]+' 

class Dance(Action): 
    regex = r'^DANCE [0-9]+' 
0

这工作:

action_types = {} 

class Action(): 
    regex = '.*' 

    @classmethod 
    def register_action(cls): 
     action_types[cls.regex] = cls 


class Sing(Action): 
    regex = r'^SING [0-9]+' 
Sing.register_action() 

class Dance(Action): 
    regex = r'^DANCE [0-9]+' 
Dance.register_action() 
0

不要试图类初始化过程中做到这一点。

这里有一个简单的方法来做到这一点:

action_types = {} 

class Action(): 
    regex = '.*' 

class Sing(Action): 
    regex = r'^SING [0-9]+' 

class Dance(Action): 
    regex = r'^DANCE [0-9]+' 

def register_action(cls): 
    action_types[cls.regex] = cls 

for cls in (Sing, Dance): 
    register_action(cls) 
相关问题