自动保存构造函数参数
通常,一个类的构造函数会接收一些参数,并把这些参数保存到实例中。例如:
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 邮件列表的讨论。