Ну, просто сделать класс iterable достаточно легко, используя мета классы (так что некоторые другие ответы здесь). Однако я хочу сделать класс итерабельным, а также позволять «перебирать подгруппу на основе наследования». Пример моего использования:Сделать класс iterable уважающим наследование
class IterPartRegistry(type):
def __iter__(cls):
return iter(cls._registry)
class A(object, metaclass=IterPartRegistry):
_registry = []
def __init__(self, name):
self.name = name
self._registry.append(self)
class B(A):
pass
class C(A):
pass
A("A - first")
B("B - first")
B("B - second")
C("C - first")
for t in A:
print(t.name)
print(" --- ")
for t in B:
print(t.name)
exit()
Первый цикл работает - он итерации по всем экземплярам и дочерним элементам «А». Однако второй цикл должен выполняться только над определенной подгруппой «A» - те, которые являются экземплярами дочернего «B» (или дети дальше по строке).
(Как) это может быть достигнуто проще всего? Таким образом, добавление большего количества подклассов требует наименьшего количества работы/изменения?
Это выглядит очень хорошо. Просто интересно - когда итерация не будет перебирать _registry каждый раз, когда я перехожу к следующему элементу. (другими словами, итерация n элементов теперь принимает O (n^2) вместо O (n) time? – paul23
, так как итератор, возвращаемый генератором, является самим генератором, возможно, это может быть просто 'return (c для c в cls. _registry if isinstance (c, cls)) ' – Pynchia
@Pynchia - Исправлено, спасибо –