【问题标题】:Pythonic way to initialize an object with a lot of parameters and default value [duplicate]用大量参数和默认值初始化对象的Pythonic方法[重复]
【发布时间】:2017-07-25 08:18:17
【问题描述】:

我需要创建一个带有很多参数的类。

class Line:

    def __init__(self, name, nb = None, price_unit = None, total = None, 
                 unit = None, time = None, session = None ):

每个属性都将获得与传递给 __init__() 的参数相同的名称和相同的值。

所以,我当然可以:

class MyClass:

    def __init__(self, name, nb = None, price_unit = None, total = None, 
                 unit = None, time = None, session = None ):
        self.name = name
        self.nb = nb
        self.price = price
        self.price_unit = price_unit
        self.total = total
        self.unit = unit
        self.time = time
        self.session = session

但这是一个非常重的符号,对我来说似乎不是 Python 的。你知道一种更蟒蛇的方式吗?

【问题讨论】:

  • 您已经在使用 Python 的方式来初始化具有默认值的对象。问题来自您的 Class API。如果参数太多,你应该考虑重构它。

标签: python python-3.x


【解决方案1】:

由于您将所有关键字参数的默认值设置为None,因此您可以做到更具可读性:

class MyClass:

    def __init__(self, name, **kwargs):
        self.name = name
        for attr in ('nb', 'price_unit', 'total', 'unit', 'time', 'session'):
            setattr(self, attr, kwargs.get(attr))

但是,我认为您的初始方法也很标准,尽管您可以通过删除参数与其默认值之间的空格来改进它。

class MyClass:
    def __init__(self, name, nb=None, price_unit=None, total=None, 
                 unit=None, time=None, session=None):
        ...

【讨论】:

  • 在 **kwargs 的情况下,您还可以只使用您想要的参数初始化对象,例如:MyClass(name, price_unit=value, total=value2)
【解决方案2】:

以一种非常pythonic的方式,它可能是:

class MyClass:
    def __init__(self, name, **kwargs):
        self.name = name
        self.__dict__.update(kwargs)

【讨论】:

  • 不适用于描述符和插槽。
【解决方案3】:

您可以使用 *args 即

def __init__(self, *args):
    self.args = args

【讨论】:

    猜你喜欢
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多