Python:迭代构造函数的参数

rah*_*hmu 13 python constructor arguments

我经常发现自己编写这样的类构造函数:

class foo:
    def __init__(self, arg1, arg2, arg3):
        self.arg1 = arg1
        self.arg2 = arg2
        self.arg3 = arg3
Run Code Online (Sandbox Code Playgroud)

如果参数(和类属性)的数量变高,这显然会变得很痛苦.我正在寻找循环构造函数的参数列表并相应地分配属性的最pythonic方法.我正在使用Python 2.7,所以理想情况下我正在寻找该版本的帮助.

Mar*_*tos 22

最恐怖的方式就是你已经写过的.如果您乐意要求命名参数,可以这样做:

class foo:
    def __init__(self, **kwargs):
        vars(self).update(kwargs)
Run Code Online (Sandbox Code Playgroud)


Dav*_*net 9

提供的答案依赖于*vargs**kargs参数,如果您想限制具有特定名称的特定参数集,则可能根本不方便:您必须手动执行所有检查.

这是一个装饰器,它将方法在其绑定实例中提供的参数存储为具有各自名称的属性.

import inspect
import functools

def store_args(method):
    """Stores provided method args as instance attributes."""
    argspec = inspect.getargspec(method)
    defaults = dict(zip( argspec.args[-len(argspec.defaults):], argspec.defaults ))
    arg_names = argspec.args[1:]
    @functools.wraps(method)
    def wrapper(*positional_args, **keyword_args):
        self = positional_args[0]
        # Get default arg values
        args = defaults.copy()
        # Add provided arg values
        list(map( args.update, ( zip(arg_names, positional_args[1:]), keyword_args.items() ) ))
        # Store values in instance as attributes
        self.__dict__.update(args)
        return method(*positional_args, **keyword_args)

    return wrapper
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用它:

class A:
    @store_args
    def __init__(self, a, b, c=3, d=4, e=5):
        pass

a = A(1,2)
print(a.a, a.b, a.c, a.d, a.e)
Run Code Online (Sandbox Code Playgroud)

结果将1 2 3 4 5在Python3.x或(1, 2, 3, 4, 5)Python2.x上