Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python将所有子类组织到字典中的好方法?_Python_Regex - Fatal编程技术网

用python将所有子类组织到字典中的好方法?

用python将所有子类组织到字典中的好方法?,python,regex,Python,Regex,我有一个基类和几个子类。每个子类都有一个名为“regex”的属性,其中包含一个字符串: # module level dictionary action_types = {} class Action(): regex = '.*' @classmethod def register_action(cls): action_types[cls.regex] = cls class Sing(Action): regex = r'^SING

我有一个基类和几个子类。每个子类都有一个名为“regex”的属性,其中包含一个字符串:

# 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字典中使用每个类的regex作为键注册所有子类。我希望注册类的逻辑仅限于基类

上面的例子不起作用,我相信这是因为使用Dance和Sing变量时,它们在名称空间中还不可用


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

你可不想这么做

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]+'
这项工作:

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 = {}

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)

为什么要为此使用单独的类?让正则表达式成为实例成员和Sing、Dance等实例有什么不对?实际上,我希望Sing和Dance类具有独特的init函数。我认为使用像Ignacio提供的示例中那样的元类模式实际上提供了这两个方面的最佳效果——子类是实例,但也可以具有唯一的init函数。