Inspect Module
Расширьте ваш миксин с помощью классов, которые его используют, и используйте модуль inspect .
С настройкой ниже мы:
- сохраняем список всех имен аргументов из
__init__
подкласса - фильтр argdict по нашему списку
Мы подавляем предупреждения, не создавая их.
import inspect
class Mixin:
@property
def names(self):
return self.__names
def __init__(self):
sig = inspect.signature(self.__init__)
self.__names = list()
for param in sig.parameters.values(): # Signature(a=None, b=None).values()
self.__names.append(str(param).split('=')[0]) # str(Parameter(a=None)).split('=')[0]
print(self.names) # [a, b]
def change_field(self, **kwargs):
""" Create a new object with only the specified properties changed."""
argdict = {**{key: self.__getattribute__(key) for key in self.__slots__}, **kwargs}
return self.__class__(**{k:v for k, v in argdict.items() if k in self.names})
class App(Mixin):
def __init__(self, a=None, b=None):
Mixin.__init__(self)
App()
Подробнее
Вы делали это наоборот. Вы должны позволить kwargs перезаписывать __slots__
ключи. Вы также пытаетесь подавить ключи, заканчивающиеся двойным подчеркиванием. Все, что не принадлежит (включая дандеры), будет удалено в этом последнем фильтре.