是否有更 pythonic 的方式来为 class 设置多个默认参数?
Is there a more pythonic way to have multiple defaults arguments to a class?
我有一个 class 有很多默认值,因为我不能重载。有没有比使用多个默认参数或使用 kwargs 更好的方法?
我考虑过将字典传递到我的 class 但我如何控制是否传递必要的参数?
是否有更 pythonic 的方式允许参数而不将它们全部定义为默认值?
例如,我允许许多默认值:
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}
在其他语言中我可能会重载构造函数的地方。
一种方法是使用 method chaining.
您可以先 class 将所有(或大部分)参数设置为默认值:
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)
当然,您并不局限于每次只设置一个参数的方法,您可以编写设置小 "families" 个参数的方法。如果需要,这些可能已经具有常规默认值。
您可以在 class 对象本身上指定默认属性,如果您希望它们非常标准,然后可以在需要时通过在实例上重新分配这些属性来掩盖这些属性。如果您希望传入不同的参数组,您还可以使用 @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)
并取回一个正确框初始化的编辑器实例。
我有一个 class 有很多默认值,因为我不能重载。有没有比使用多个默认参数或使用 kwargs 更好的方法?
我考虑过将字典传递到我的 class 但我如何控制是否传递必要的参数?
是否有更 pythonic 的方式允许参数而不将它们全部定义为默认值?
例如,我允许许多默认值:
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}
在其他语言中我可能会重载构造函数的地方。
一种方法是使用 method chaining.
您可以先 class 将所有(或大部分)参数设置为默认值:
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)
当然,您并不局限于每次只设置一个参数的方法,您可以编写设置小 "families" 个参数的方法。如果需要,这些可能已经具有常规默认值。
您可以在 class 对象本身上指定默认属性,如果您希望它们非常标准,然后可以在需要时通过在实例上重新分配这些属性来掩盖这些属性。如果您希望传入不同的参数组,您还可以使用 @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)
并取回一个正确框初始化的编辑器实例。