Предоставленные ответы основаны на аргументах *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
Затем вы можете использовать его следующим образом:
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)
Результат будет 1 2 3 4 5
на Python3.x или (1, 2, 3, 4, 5)
на Python2.x