Как я могу получить доступ к атрибутам из всех родительских классов?
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
,