【问题标题】:Is there a more pythonic way to have multiple defaults arguments to a class?有没有一种更 Pythonic 的方式来为一个类提供多个默认参数?
【发布时间】:2017-01-22 23:09:31
【问题描述】:

我有一个有很多默认值的类,因为我不能重载函数。有没有比拥有多个默认参数或使用 kwargs 更好的方法?

我曾考虑将字典传递给我的班级,但我如何控制是否传递必要的参数?

如果有更 Python 的方式来允许参数而不将它们全部定义为默认值?

例如,我允许许多默认值:

class Editor:
    def __init__(self,
                 ffmpeg: str,
                 font_file=None,
                 font_size=148,
                 font_color="white",
                 title_length=5,
                 title_x="(w-text_w)/2",
                 title_y="(h-text_h)/2",
                 box=1,
                 box_color="black",
                 box_opacity=0.5,
                 box_border_width=25):

        self.ffmpeg = ffmpeg

        self.title s= define_title(
            font_file, font_size, font_color, title_length)

        self.box = define_box(
            box, box_color, box_opacity, box_border_width},

        self.coordinates = {"x": title_x, "y": title_y}

在其他语言中,我可能会重载构造函数。

【问题讨论】:

  • 你能把它分解成子对象吗?例如一个 box 对象,它只需要最后 4 个参数。然后你只需将box 传递给Editor

标签: python class constructor default-arguments


【解决方案1】:

一种方法是使用method chaining

您可以从一些类开始,将所有(或大部分)参数设置为默认值:

class Kls(object):
    def __init__(self):
        self._var0 = 0
        self._var1 = 1

然后你添加设置每个需要的方法:

    def set_var_0(self, val):
        self._var0 = val
        return self

    def set_var_1(self, val):
        self._var1 = val
        return self

现在,当你创建一个对象时,你可以设置必要的:

c = Kls()

c = Kls().set_var_1(2)

c = Kls().set_var_1(22).set_var_0(333)

当然,您不仅限于编写每次设置单个参数的方法,您还可以编写设置小“系列”参数的方法。如果需要,这些可能已经具有常规默认值。

【讨论】:

    【解决方案2】:

    如果您希望它们非常标准,您可以在类对象本身上指定默认属性,然后可以通过在需要时在实例上重新分配这些属性来掩盖这些属性。如果您希望传入不同的参数组,您还可以使用@classmethod 创建多个构造函数。

    class Editor(object):
        font_file = None
        font_size = 148
        def __init__(self, ffmpeg=str):
            self.ffmpeg = ffmpeg
        @classmethod
        def with_box(cls, ffmpeg=str, box=1):
            new_editor = cls(ffmpeg)
            new_editor.box = box
            return new_editor
    

    然后你会调用:

    Editor.with_box(ffmpeg=int, box=2)
    

    并取回一个正确初始化的编辑器实例。

    【讨论】:

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