Have you thought about using a metaclass? You could grab all new class fields on its creation, and then use them to create either the list or the dictionary if needed.
>>>class DadMeta(type):
... def __new__(mcs, name, bases, dct):
... values_dict = {}
... values_list = []
... for name, value in dct.items():
... if not callable(value) and not name.startswith("__"):
... values_dict[name] = value
... values_list.append(value)
...
... cls = super().__new__(mcs, name, bases, dct)
... cls.values_list = getattr(cls, "values_list", []) + values_list
... cls.values_dict = {**getattr(cls, "values_dict", {}), **values_dict}
...
... return cls
...
>>>class Dad(metaclass=DadMeta):
... var_1 = "foo"
... var_2 = "bar"
...
>>>Dad.values_list
['foo', 'bar']
>>>Dad.values_dict
{'var_1': 'foo', 'var_2': 'bar'}
>>>class Son(Dad):
... var_3 = "test"
... var_4 = "meh"
...
>>>Son.values_list
['foo', 'bar', 'test', 'meh']
>>>Dad.values_list
['foo', 'bar']
>>>Son.values_dict
{'var_1': 'foo', 'var_2': 'bar', 'var_3': 'test', 'var_4': 'meh'}
This should also work nicely with inheritance, if needed.