针对与单个配置相关的参数的良好设计

2024-10-03 17:19:42 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我们有一个表示长方体的类:

class Box:
    pass

它的构造函数可以采用一些表示对象的参数,例如长度、宽度和高度:

class Box:

    def __init__(self, length, width, height):
        self.length = length
        self.width = width
        self.height = height

现在,我想添加一个为长方体添加阴影的可能性,但它必须是可选的,假设阴影可以用shadowcolorshadowstrength来描述。有3种方法可以向构造函数添加描述shadow的参数:

class Box:

    def __init__(self, ..., drop_shadow=False, shadowcolor=None, shadowstrength=None):
        if drop_shadow:
            pass

这是最显式的方法,但是drop_shadow这里有点多余,因为我们可以只检查shadowcolorshadowstrength是否不是None并将阴影设置为框:

class Box:

    def __init__(self, ..., shadowcolor=None, shadowstrength=None):
        if shadowcolor and shadowstrength:
            pass

我们放弃了一个多余的论点,但现在添加阴影的可能性更为隐含

另一种方法是使用一个参数-shadow,它是由两个参数组成的元组,其中第一个参数是shadowcolor,另一个参数是shadowstrength

class Box:

    def __init__(self, ..., shadow=None):
        self.shadowcolor = shadow[0]
        self.shadowstrength = shadow[1]

现在我们只有一个参数,但是隐式的级别更高

我非常关心这一点,因为这将在开源软件包中使用,我希望尽可能轻松地使用类

您建议如何处理另一个对象的这种“构造函数内”配置


Tags: selfboxnone参数initdefpasswidth
1条回答
网友
1楼 · 发布于 2024-10-03 17:19:42

让函数接受所有参数的字典。比如说

创建:

parameters =  {"dropShadow": true, "shadowColor": "#019201"}

传过去

def __init__(self, length, width, height, params):
        self.length = length
        self.width = width
        self.height = height

        for key, value in params.items():
          if key == "dropShadow":
            self.dropShadow = value
          elif key == "shadowColor"
            self.shadowColor = value

如果您不想使用硬编码字符串(我不建议这样做),那么创建一个将所有属性定义为静态变量的形状模型类。比如说

class ShapeModel:
  DROP_SHADOW = "dropShadow"
  SHADOW_COLOR = "shadowColor"

然后将上述代码替换为

      def __init__(self, length, width, height, params):
        self.length = length
        self.width = width
        self.height = height

        for key, value in params.items():
          if key == ShapeModel.DROP_SHADOW:
            self.dropShadow = value
          elif key == ShapeModel.SHADOW_COLOR:
            self.shadowColor = value

相关问题 更多 >