class Base:
    
    def __init__(self, **kwargs):
        
        # itera em uma cópia dos items do dicionário, 
        # permitindo que ele seja alterado durante o "for":
        for name, value in list(kwargs.items()):
            # Verifica se o parâmetro existe na própria classe,
            # caso contrário, mantem o mesmo no dicionário.
            if not hasattr(self, name):
                continue
            if not isinstance(value, getattr(self, name)):
                raise TypeError("Incorrect parameter type passed for {}. An '{}' was expected.".format(
                    self.__name__, getattr(self, name).__name__))
            setattr(self, name, value)
            del kwargs[name]


class Pessoa(Base):
    
    def __init__(self, kwargs):
        self.nome = str
        self.idade = int
        self.endereco = dict
        
        super(Pessoa, self).__init__(**kwargs)
    
params = { "nome": "Lol", "idade": 30, "endereco": { "logradouro": "rua longe pra cacete", "numero": "300" } }

p  = Pessoa(params)

print(p.nome, p.idade)