【问题标题】:Design pattern for interface for different classes不同类的接口设计模式
【发布时间】:2019-10-02 10:38:46
【问题描述】:

我正在寻找在类设置中实现接口的正确设计模式。

我的文件结构如下:

  1. models:其中包含用类编写的不同模型,例如ModelsubModelAsubModelBsubsubModelC 等。
  2. 计算器:其中包含每个型号的不同计算器工具。 注意计算器需要导入模型属性进行计算。

我的问题是我应该如何构建我的计算器文件以遵循模型的结构。

我最初的尝试是为我的 calculator 编写一个 ABC 类,然后为 model 中的每个 subModel 类编写一个相应的 subCalculator 子类来实施。然而,这似乎并没有充分利用 model 中规定的类结构。

我尝试的一些小例子:

# in model.py

class model(object):
    def __init__(self,attr1):
        self.attr1 = attr1

class submodel(model):
    def __init__(self, attr1, attr2):
        super().__init__(attr1)
        self.attr2
# in calculator.py
from model import model

class calculator(abc.ABC):
    @staticmethod
    @abc.abstractmethod
    def calculate(model):
        return model.attr1 ** 2

class subcalculator(calculator):
    def calculate(model):
        y = super(subcalculator, subcalculator).calculate(model)
        return y + model.attr2 ** 3

我调查了here 中列出的一些设计模式目录,策略似乎是正确的模式。但是那里的婴儿示例并没有解决我的问题,因为我希望在模型文件中使用类结构。

我希望有人可以在这种情况下给我一个更完整的例子。提前致谢。

【问题讨论】:

  • 您应该避免并行继承层次结构。从您发布的代码看来,calculate() 方法应该是模型中的一个方法。
  • @quamrana 是的。但是有没有办法在一个单独的文件中挑选出计算方法,以增加我的文件的可读性。现实生活中的calculate() 是一团糟,所以我想将它们单独列出,以便将来维护代码。

标签: python design-patterns interface class-method


【解决方案1】:

所以你可以像这样分离模型和计算器:

# in model.py

import calculator as cal

class model(object):
    def __init__(self,attr1):
        self.attr1 = attr1
    def calculate(self):
        return cal.defaultCalc(self)

class submodel(model):
    def __init__(self, attr1, attr2):
        super().__init__(attr1)
        self.attr2
    def calculate(self):
        return cal.subCalc(self)

# in calculator.py

def defaultCalc(model):
    return model.attr1 ** 2

def subCalc(model):
    return defaultCalc(model) + model.attr2 ** 3

【讨论】:

  • 谢谢!我一开始就是这么想的。但在这种情况下,calculator.py 中不同Calc 方法之间的相互依赖似乎只在函数中显示。有没有办法让它更明显? (除了简单地评论你的代码)或者这完全是一种不好的做法......
猜你喜欢
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-20
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多