自动保存构造函数参数

5 投票
2 回答
2922 浏览
提问于 2025-04-17 19:32

通常,一个类的构造函数会接收一些参数,并把这些参数保存到实例中。例如:

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 个回答

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

这段话的意思是,你需要写更多的代码。它会默默地忽略所有传给Example构造函数的错误参数,而且不支持位置参数传给Example构造函数,但这样做的好处是避免使用inspect这个工具。

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

当然,传给 __init__ 的参数必须都是已经声明的槽位。

否则,这在任何Python的实现中都应该能正常工作。

你可能会对这个话题的 之前讨论 感兴趣,这引发了一场 Python-ideas 邮件列表的讨论

撰写回答