自动保存构造函数参数

时间:2013-03-18 18:24:24

标签: python constructor

类的构造函数通常会接受它的参数并将它们保存在实例上。例如:

class Example(object):
    def __init__(self, title='',backtitle='', height=20, width=50):
        self.title = title
        self.backtitle = backtitle
        self.height = height
        self.width = width

这是重复的,所以我做了一个辅助函数来自动执行此操作:

from inspect import getargspec
def save_args(values):
    for i in getargspec(values['self'].__init__).args[1:]:
        values['self'].__dict__[i] = values[i]

class Example(object):
    def __init__(self, title='',backtitle='', height=20, width=50):
        save_args(vars())

我的问题如下:

  • 这会因某些课程或课程而失败
  • 它是否可移植,是否适用于Jython等。它适用于python 2.7和3.2
  • 是否有更简单的替代方案?
  • 那里有一个python包吗?

2 个答案:

答案 0 :(得分:5)

当您的班级使用__slots__时,它会失败。您可以改为使用setattr()

from inspect import getargspec
def save_args(values):
    for i in getargspec(values['self'].__init__).args[1:]:
        setattr(values['self'], i, values[i])

提供__init__的参数关键字参数当然都是声明的插槽。

否则这应该适用于任何Python实现。

您可能会对previous discussion of the topic感兴趣,这会引发Python-ideas list thread

答案 1 :(得分:1)

这要求您编写更多代码,静默忽略Example构造函数的所有错误参数,并且不支持Example构造函数的位置参数,但避免使用inspect

def save_args(obj, defaults, kwargs):
    for k,v in defaults.iteritems():
        if k in kwargs: v = kwargs[k]
        setattr(obj, k, v)

class Example(object):
    def __init__(self, **kwargs):
        defaults = { 'title': '',
                     'backtitle': '',
                     'height': 20,
                     'width': 50 }
        save_args(self, defaults, kwargs)