【发布时间】: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