Как я могу получить доступ к атрибутам из всех родительских классов?

class T(object):
    def f(self):
        pass

class T1(T):
    fields = set(('x1', 'y1', 'z1'))

class T2(T1):
    fields = set(('x2', 'y2'))

t=T2()

Я хочу звонок t.f() вернуть set(('x1','y1','z1','x2','y2')) и я не хочу переписывать 'f' в каждом дочернем классе, понимаете?

1 ответ

Решение

Это работает для вашего примера:

class T(object):
    def f(self):
        fields = set()
        for cls in self.__class__.mro():
            if hasattr(cls, 'fields'):
                fields = fields.union(cls.fields)
        return fields

class T1(T):
    fields = set(('x1', 'y1', 'z1'))

class T2(T1):
    fields = set(('x2', 'y2'))

t = T2()
t.f()

возвращает:

{'x1', 'x2', 'y1', 'y2', 'z1'}

Метод mro() дает вам порядок разрешения метода. Это список классов, которые Python посещает по очереди, чтобы найти метод. Таким образом, если метод не завершает работу в дочернем классе, его будут искать в классах этого списка. Если последний класс не имеет этого атрибута, он выдаст AttributeError, Здесь мы используем этот список для поиска атрибута fields в списке родителей и положить все найденные наборы в результирующий набор fields,

Другие вопросы по тегам