类的构造函数通常会接受它的参数并将它们保存在实例上。例如:
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())
我的问题如下:
答案 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)