Допустим, у меня есть класс как таковой:
class Test:
def __init__(self, a, b):
self.a = a
self.b = b
Моя цель - создать decorator
, который обрабатывает заполнение init
аргументов, если они не существуют, то есть:
class Test:
@autoinit
def __init__(self, a, b):
self.a = a
self.b = b
, где @autoinit
определяется как таковое:
class autoinit:
def __init__(self, data = {"a": "test_a", "b": "test_b"}):
self.data = data
def __call__(self, func):
decorator = self
def wrapper(*args, **kwargs):
print(decorator.data)
func(self, **decorator.data)
print(decorator.data)
return wrapper
Таким образом, атрибуты Test
будут автоматически присвоены test_a, test_b
соответственно.
Идеальное использование быть таким:
test = Test(a="test_z", b="test_x")
test.a == "test_z"
test.b == "test_x"
# however,
test = Test()
test.a == "test_a"
test.b == "test_b"
# but also,
test = Test(a="test_z")
test.a == "test_z"
test.b == "test_b"
У меня всегда будут совпадающие аргументы в классе Test
с ключами в словаре data
.
Возможно ли это? Какая самая чистая реализация?
Обновление:
Предполагаемое использование - во многих независимых классах. Например, предположим, что у меня есть глобальная конфигурация как таковая:
config = {
"resourceA": {"a": "test_a", "b": "test_b"},
"resourceB": {"name": "foo", "value": "bar"}
}
Цель состоит в том, чтобы декоратор @autoinit(resource="resourceA")
использовал **config[resource]
для заполнения всех __init__
значений для данного класса.