You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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两个产品类,属于不必要的冗余继承。
解决方案
  1. 给MyLoggerFactory类添加__getitem__方法,支持下标取值操作,或者调用时直接访问类内部的log_factory字典。
  2. 统一方法名,将调用处的write_log_message改为write_message。
  3. 修正缺失的变量定义,移除不必要的继承关系。
修复后的参考代码
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 06:57:00