Python中将字符串内容映射到方法调用的优雅方式



给出这个示例代码,其中我们有一系列日志处理器,我不禁觉得应该有一种更python/更有效的方法来决定使用哪个日志处理器来处理某些数据:

class Component1ErrorLogProcessor:
def process(logToProcess):

# Do something with the logs
pass

class Component2ErrorLogProcessor:
def process(logToProcess):

# Do something with the logs
pass

class LogProcessor:
def __init__(self):
self.component1 = Component1ErrorLogProcessor()
self.component2 = Component2ErrorLogProcessor()
def process_line(self, line, component):
if component == "Component1Log-" or component == "[Component1]":
self.component1.process_errors(line)
elif component == "Component2Log-" or component == "[Component2]":
self.component2.process_errors(line)

我个人使用注册中心的思想,因此您可以将每个类映射到组件名称。

有很多不同的方法可以做到这一点,这里有一个使用基类的快速示例:
class ComponentLogProcessor(object):
_Mapping = {}
@classmethod
def register(cls, *component_names):
for name in component_names:
cls._Mapping[name] = cls

@classmethod
def cls_from_component(cls, component):
return cls._Mapping[component]

class Component1ErrorLogProcessor(ComponentLogProcessor):
def process(logToProcess):
# Do something with the logs
pass
Component1ErrorLogProcessor.register('Component1Log-', '[Component1]')
class Component2ErrorLogProcessor(ComponentLogProcessor):
def process(logToProcess):
# Do something with the logs
pass
Component2ErrorLogProcessor.register('Component2Log-', '[Component2]')

class LogProcessor:
def process_line(self, line, component):
ComponentLogProcessor.cls_from_component(component).process_errors(line)

最新更新