Python中的动态类
有这样一个需求,我有SegmentReader
、PostagReader
、ConllReader
这三个Reader
,他们都继承于一个Reader
类。在程序运行中,由用户通过segment
、postag
或conll
决定读入哪一种数据,所以XReader
的实例化也由用户决定。当然,我们可以写一连串的if判断,但是这往往不够美观。这里有一个python动态创建类的问题。
Python中有个一函数globals()
返回当前全局的符号表,如果已经import了这三个类,他们就会出现在全局的符号表中。
from corpusproc.io import SegmentReader, PostagReader, ConllReader def createObject(className, * args): cls = globals()[className] if isinstance(cls, type) and isinstance(args[0], file): return cls(args[0]) else: raise Exception("No such class")
测试一下
format = "segment"
reader = createObject(format[0].upper() + format[1:]) format = "unknown" reader = createObject(format[0].upper() + format[1:]) # Raise Exception "No such class"