Допустим, у меня есть иерархия классов, в которых каждый класс имеет связанный список элементов для конкретных классов, например,
Код: Выделить всё
class Thing:
Items = ['Exist']
class Being(Thing):
Items = ['Live', 'Die']
class Human(Being):
Items = ['Read' 'Write']
< /code>
Я хотел бы определить функцию getallitems (), которая для любого класса в иерархии вернет свои собственные элементы и элементы его суперклассий, то есть: < /p>
Thing.GetAllItems() # ==> ['Exist']
Being.GetAllItems() # ==> ['Live', 'Die', 'Exist']
Human.GetAllItems() # ==> ['Read', 'Write', 'Live', 'Die', 'Exist']
что я попробовал
Я думал, что могу написать какую -то простую рекурсивную функцию в соответствии с: < Br />
Код: Выделить всё
class A:
Items = [A1, A2, A3]
def GetAllItems(): # not sure how to do this for a static method
return getattr(type(self),'Items') + super().GetAllItems()
Самое близкое, что я получил,-это указать переменную разных элементов в каждом классе, а затем предоставить (нестатическую) функцию getallitems () для каждого класса, например, так: < /p>
class A:
ItemsA = [A1, A2, A3]
def GetAllItems():
return A.ItemsA # this is the "root" function
class B(A):
ItemsB = [B1, B2, B3]
def GetAllItems():
return B.ItemsB + super().GetAllItems()
class C(B):
ItemsC = [C1, C2, C3]
def GetAllItems():
return C.ItemsC + super().GetAllItems()
< /code>
Хотя это не конец света, чтобы добавить такую функцию в каждый полученный класс, у меня много классов, и было бы неплохо иметь возможность сделать это с Один кусок кода как -то без копирования и вставки, в основном, везде везде ... плюс я все еще не до конца понимаю, как работает Super (), поэтому я чувствую, что, возможно, есть более элегантное решение для этого. *** Обновление *** < /p>
Просто хотел поделиться версией, которая, кажется, работает в моем простом случае (без множественного наследства) < /p>
class Thing:
Items = ['Exist']
@classmethod
def GetAllItems(cls):
return cls.Items
class Being(Thing):
Items = ['Live', 'Die']
@classmethod
def GetAllItems(cls):
return cls.Items + cls.__base__.GetAllItems()
< /code>
, а затем все классы, полученные от того, что они не нуждаются в дополнительных объявлениях getallitems (). Я думаю, что это может работать для простой цепочки наследования, то есть b (a), c (b), d (c) и т. Д. - но для более общих случаев, таких как множественное наследство, я думаю @d. Фоли имеет правильную рекомендацию на основе cls.mro ()
Подробнее здесь: https://stackoverflow.com/questions/794 ... perclasses