【问题标题】:Python factory pattern - object is not subscriptablePython 工厂模式 - 对象不可下标
【发布时间】:2021-12-02 06:51:50
【问题描述】:

我正在编写一些 python 代码 - 尝试实现组合和工厂模式:


from abc import ABC, abstractmethod
import configparser
import os
from pathlib import Path
import sys



class LoggerAbstract(ABC):

  def __init__(self, option_one=option_one_value, option_two=option_two_value): 
    pass

  def read_configurations(self, configurations_dict): 
    pass
    
  def write_message(self, message): 
    pass
      

class MyLogger(LoggerAbstract):

  def __init__(self, option_one=option_one_value, option_two=option_two_value): 

    super().read_configurations(self.configurations_dict)

  def write_message(self, message): 
    pass
    

class MyLoggerCritical(MyLogger):

  def __init__(self, option_one=option_one_value, option_two=option_two_value): 

  def write_message(self, message): 
    pass


class MyLoggerDebug(MyLogger):

  def __init__(self, option_one=option_one_value, option_two=option_two_value): 

  def write_message(self, message): 
    pass


class MyLoggerFactory(MyLoggerCritical, MyLoggerDebug):

  log_factory = {
    "critical": None,
    "debug": None,
  }


  def __init__(self, option_one=option_one_value, option_two=option_two_value): 

    self.log_factory['critical'] = MyLoggerCritical(option_one="John", option_two="Doe")
    self.log_factory['debug'] = MyLoggerDebug(option_one="John", option_two="Doe")



class LogFactoryDriver:

  def __init__(): 
  
    my_logger_factory = MyLoggerFactory()
    my_logger_factory['critical'].write_log_message("this is a message")


def main():
  
  my_logger_factory_driver = LogFactoryDriver()
  
if __name__ == "__main__":
  main()

我遇到的问题是调用 write_message() 方法。我的直觉是使用字典创建工厂是一个坏主意。到目前为止,我阅读的所有内容都提到使用字典值来存储不同的方法名称。

是否可以将对象分配给字典值,然后调用这些对象的方法?它似乎不喜欢这个电话:

   my_logger_factory['critical'].write_log_message("this is a message")

抛出以下错误:

TypeError: 'MyLoggerFactory' object is not subscriptable

【问题讨论】:

  • 代码写好了,需要my_logger_factory.log_factory['critical']
  • 如果你确实想写'my_logger_factory['critical'],你需要创建一个MyLoggerFactory.__get_item__的实现。
  • “我的直觉是使用字典创建工厂是个坏主意。”不,不是。无论如何,这里的错误非常简单。 my_logger_factory = MyLoggerFactory() 是一个 MyLoggerFactory 对象。然后您使用my_logger_factory['critical'].... 您希望发生什么?目前,MyLoggerFactory 对象不可下标,因此出现错误。无论如何,今后提供minimal reproducible example。这段代码的大部分是完全不相关的(甚至不完整!)
  • 这甚至不是一个工厂,因为你只是在__init__中实例化所有不同的类型
  • 谢谢你们。 @juanpa.arrivillaga,当我将我正在使用的实际代码中的代码拼凑在一起时,我很仓促。您能否分享一个利用工厂模式的示例/示例代码?无论如何,我修复了代码并将其发布在这里。

标签: python class factory abstract base


【解决方案1】:

正如@juanpa.arrivillaga 指出的那样,我最初发布的代码不完整。以下是修复代码:


from abc import ABC, abstractmethod
import configparser
import os
from pathlib import Path
import sys



class LoggerAbstract(ABC):

  def __init__(self, option_one="John", option_two="Doe"): 
      pass

  def read_configurations(self, configurations_dict): 
      pass
    
  def write_log_message(self, message): 
      pass
      

class MyLogger(LoggerAbstract):

  def __init__(self, option_one="John", option_two="Doe"): 

    super().read_configurations()

  def write_log_message(self, message): 
      pass
    

class MyLoggerCritical(MyLogger):

  def __init__(self, option_one="John", option_two="Doe"): 
    pass

  def write_log_message(self, message): 
      print(f"The message received is: {message}")


class MyLoggerDebug(MyLogger):

  def __init__(self, option_one="John", option_two="Doe"):
    pass 

  def write_log_message(self, message): 
      pass


class MyLoggerFactory(MyLoggerCritical, MyLoggerDebug):

  log_factory = {
    "critical": None,
    "debug": None,
  }


  def __init__(self, option_one="John", option_two="Doe"): 

    self.log_factory['critical'] = MyLoggerCritical(option_one="John", option_two="Doe")
    self.log_factory['debug'] = MyLoggerDebug(option_one="John", option_two="Doe")

  def write_log_message(self, message):
    print(f"Message received is: {message}") 


class LogFactoryDriver:

  def __init__(self, option_one="John", option_two="Doe"): 
  
    my_logger_factory = MyLoggerFactory()
    my_logger_factory.log_factory['critical'].write_log_message("this is a message")


def main():
  
  my_logger_factory_driver = LogFactoryDriver()
  
if __name__ == "__main__":
  main()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多