Python工厂模式实现报错:'MyLoggerFactory' object is not subscriptable
问题原因
TypeError: 'MyLoggerFactory' object is not subscriptable报错的直接原因是:你尝试用[]下标语法访问MyLoggerFactory类的实例,但该类没有实现Python的__getitem__魔术方法,解释器无法识别这种取值操作。- 你提到的「把对象存入字典值后调用其方法」的思路完全可行,字典的值可以存储任意Python对象,包括自定义类的实例,调用实例方法不会有任何问题。
- 额外存在的代码问题:你定义的日志写入方法名为
write_message,但调用时写为了write_log_message,方法名不匹配也会引发报错;代码中使用的option_one_value、option_two_value没有预先定义,会抛出NameError;MyLoggerFactory作为工厂类无需继承MyLoggerCritical、MyLoggerDebug两个产品类,属于不必要的冗余继承。
解决方案
- 给
MyLoggerFactory类添加__getitem__方法,支持下标取值操作,或者调用时直接访问类内部的log_factory字典。 - 统一方法名,将调用处的
write_log_message改为write_message。 - 修正缺失的变量定义,移除不必要的继承关系。
修复后的参考代码
from abc import ABC, abstractmethod class LoggerAbstract(ABC): # 补充默认参数的默认值,避免NameError def __init__(self, option_one=None, option_two=None): self.option_one = option_one self.option_two = option_two def read_configurations(self, configurations_dict): pass @abstractmethod def write_message(self, message): pass class MyLogger(LoggerAbstract): def __init__(self, option_one=None, option_two=None): super().__init__(option_one, option_two) # 这里补充configurations_dict的定义逻辑,示例做简化处理 self.configurations_dict = {} super().read_configurations(self.configurations_dict) def write_message(self, message): pass class MyLoggerCritical(MyLogger): def write_message(self, message): print(f"[CRITICAL] {message}") class MyLoggerDebug(MyLogger): def write_message(self, message): print(f"[DEBUG] {message}") # 移除不必要的继承 class MyLoggerFactory: def __init__(self, option_one=None, option_two=None): self.log_factory = { "critical": MyLoggerCritical(option_one=option_one, option_two=option_two), "debug": MyLoggerDebug(option_one=option_one, option_two=option_two), } # 实现__getitem__支持下标访问 def __getitem__(self, key): return self.log_factory[key] class LogFactoryDriver: def __init__(self): my_logger_factory = MyLoggerFactory(option_one="John", option_two="Doe") # 修正方法名 my_logger_factory['critical'].write_message("this is a message") my_logger_factory['debug'].write_message("this is a debug message") def main(): my_logger_factory_driver = LogFactoryDriver() if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者Ubaidul Khan
相关产品推荐
相关产品推荐

