Вот метод, который делает то, что вы хотите! Добавьте его к своему объекту, вот мой код и результат:
@attr.s(frozen=True, slots=True)
class Config:
param1: int = attr.ib()
param2: str = attr.ib()
def some_magical_method(self, **kwargs):
params_to_use = {"param1": self.param1, "param2": self.param2}
params_to_use.update(kwargs)
new_obj = Config(**params_to_use)
return new_obj
my_base_config = Config(param1=1, param2="2")
my_derived_config = my_base_config.some_magical_method(param2="two")
>>> print(my_derived_config.param1) # output: 1
1
>>>print(my_derived_config.param2) # output: two
two
Ключевым моментом здесь является то, что метод создает новый объект Config, используя сначала свои собственные значения, а затем перезаписывая любые, которые передаются в метод с использованием params_to_use.update(kwargs)
. Обновленные значения затем передаются в конструктор / инициализацию нового объекта, который возвращается.
Надеюсь, что это поможет, удачного кодирования!