2017-07-25 63 views
4

我需要创建一个类,它需要很多参数。用很多参数和默认值初始化一个对象的Python方法

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的我。你知道更多的pythonic方式吗?

+0

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

回答

8

既然你设置所有的关键字参数默认为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): 
     ... 
+0

在** kwargs的情况下,您还可以仅使用您想要的参数来初始化对象:MyClass(name,price_unit = value,total = value2) – Lucian

-1

您可以使用* ARGS即

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

在一个非常Python化的方式,则可能是:

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

不适用于描述符和插槽。 –

相关问题