Есть задача - в цикле пройтись по всем уровням наследования класса, выполняя определенную манипуляцию с его полями. Список предков класса доспупен по self.__class__.__mro__ и я могу получить доступ к полям предка каждого класса из списка вызовом super(). Получился код примерно следующего содержания:
class BaseClass(object):
def __init__(self, *args, **kwds):
classes = []
for cls in reversed(self.__class__.__mro__):
if cls is object or cls is ControlBase:
continue #super() от object и super() от ControlBase мне не нужны, т.к. там фактически поля object'а
classes.append(super(cls, self))
classes.append(self) #грязный хак для включения самого верхнего уровня
for cls in classes:
self.do_something(cls)
def do_something(self, cls):
if hasattr(cls, '__thisclass__'): #и тут грязный хак для различия между чистым self и списком прокси-классов, возвращенных super()
names = cls.__thisclass__.__dict__
else:
names = cls.__class__.__dict__
for name, val in names.iteritems():
pass #Здесь мои манипуляции
В общем, слишком много некрасивых костылей. Вопрос в том, как сделать прокси класс аналогичный возвращаемому super(), то есть связать текущий self с методами определенного класса из числа предков, но так, чтобы прокси класс давал доступ к полям самого класса, а не его предка.