Beh, semplicemente rendere una classe iterabile è abbastanza semplice utilizzando le meta classifiche (quindi alcune altre risposte qui). Tuttavia desidero rendere una classe iterabile, e anche abilitarne una per "iterare un sottogruppo basato sull'ereditarietà". Un esempio del mio uso:Rendi la classe iterable rispettando l'ereditarietà
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()
Il primo ciclo funziona, itera su tutte le istanze e i child di "A". Tuttavia il secondo ciclo dovrebbe essere eseguito solo sul sottogruppo specifico di "A" - quelli che sono istanze del bambino "B" (o bambini più avanti sulla linea).
(Come) può essere ottenuto più semplice? In tal modo l'aggiunta di più sottoclassi richiede una minima quantità di lavoro/cambiamento?
Questo sembra davvero buono. Mi chiedo solo - quando iterando non itererà il _registry ogni volta che andrò al prossimo elemento. (in altre parole l'iterazione di n elementi ora richiede O (n^2) invece di O (n) tempo? – paul23
poiché l'iteratore restituito da un generatore è il generatore stesso, forse potrebbe essere semplicemente 'return (c per c in cls. _registry if isinstance (c, cls)) ' – Pynchia
@Pynchia - Risolto, grazie –