5

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

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())

我的问题如下:

  • 这会在某些类或 agruments 上失败吗
  • 它是可移植的,它可以在 Jython 上工作吗?等等。它在 python 2.7 和 3.2 上对我有用
  • 有没有更简单的选择?
  • 那里有一个已经这样做的python包吗?
4

2 回答 2

6

当您的班级使用__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])

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

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

您可能对该主题的先前讨论感兴趣,该讨论引发了Python-ideas 列表线程

于 2013-03-18T18:27:48.447 回答
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)
于 2013-03-18T18:35:31.863 回答