【问题标题】:Are classes that take an argument with variable type bad architecture类是否接受具有可变类型的参数的不良架构
【发布时间】:2019-12-14 23:57:51
【问题描述】:

我正在开发一个包含多个 Python 模块的代码库,这些模块提供特定功能,每个模块都有一个类。这些类在代码中的其他位置导入,它们采用单个参数,即从配置文件创建的自定义 parameters 对象。

这在应用程序中工作得很好,但是对于单独导入类以在其他地方使用它们的功能并不是很好,因为即使特定类只有一个参数,您也必须为每个类创建一个 parameters 对象。

为简化起见,我想检查单个参数的类型:

  • 如果是parameters 对象,则按照已实现的方式继续操作
  • 如果是字符串,以自定义方式实例化类
class Ruler:

    def __init__(self, parameters):
        if isinstance(parameters, paramsObject):
            self.config = parameters
        elif isinstance(parameters, str):
            self.length = parameters

在此之后我可以处理ruler = Ruler('30cm') 而无需创建参数对象。

问题是:那是好的架构吗?如果有一些我在这里遗漏的原则。

【问题讨论】:

    标签: python class architecture


    【解决方案1】:

    我会说您针对反模式问题提出了反模式解决方案。

    现有架构(过度)使用paramsObject 有点无益。毕竟,命名函数参数的存在是有原因的,这只是混淆了Ruler 实例化真正需要的东西。让所有函数都采用 *args**kwargs 并没有太大区别。

    您提出的解决方案是一种手册function overloading,由于类型系统,Python 没有该解决方案。 Python 有鸭子类型,也就是说,如果它像 paramsObject 一样走路并且像 paramsObject 一样嘎嘎叫,那么它就是 paramsObject

    换句话说,更简单的解决方案是找出 Rulerparameters 中寻找的值,然后仅将这些值添加到新类中:

    class RulerParameter:
        def __init__(self, length):
            self.length = length
    
    class Ruler:
        def __init__(self, parameters):
            self.config = parameters
    
        def get_length(self):
          return self.config.length
    
    my_ruler = Ruler(RulerParameter(30))
    print(my_ruler.get_length())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-21
      • 1970-01-01
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      • 2023-01-25
      • 1970-01-01
      相关资源
      最近更新 更多