Python: Machen Klasse iterierbar
Ich habe geerbt ein Projekt mit vielen großen Klassen Bestandteil von nichts aber die class-Objekte (zahlen, strings, etc.). Ich möchte in der Lage sein zu überprüfen, ob ein Attribut vorhanden, ohne benötigt zu definieren, der eine Liste der Attribute manuell.
Ist es möglich, ein python - Klasse wiederholenden, sich selbst mit der standard-syntax? Das heißt, ich möchte in der Lage sein zu iterieren über alle einer Klasse werden die Attribute mit for attr in Foo:
(oder sogar if attr in Foo
), ohne erstellen Sie eine Instanz der ersten Klasse. Ich denke, ich kann dies tun, indem Sie die Definition __iter__
, aber bisher habe ich noch nicht ganz geschafft, was ich Suche.
Habe ich erreicht, was ich will, durch hinzufügen eines __iter__
Methode etwa so:
class Foo:
bar = "bar"
baz = 1
@staticmethod
def __iter__():
return iter([attr for attr in dir(Foo) if attr[:2] != "__"])
Aber diese nicht ganz erreichen, was ich Suche:
>>> for x in Foo: ... print(x) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'classobj' object is not iterable
Sogar so, das funktioniert:
>>> for x in Foo.__iter__(): ... print(x) bar baz
InformationsquelleAutor multipleinterfaces | 2011-03-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fügen Sie die
__iter__
zu der Metaklasse, anstatt die Klasse selbst (vorausgesetzt, Python-2.x):Für Python 3.x verwenden Sie
Der Grund OP ' s Ansatz nicht funktioniert, ist, dass die
__iter__
Methode funktioniert nur für Instanzen der Klasse. Diese Unebenheiten der__iter__
Methode bis zu Instanzen der Metaklasse, d.h. die Klasse.Das macht Sinn, danke für die Erklärung.
Wie andere Magische Methoden,
__iter__
gesucht wird im Raum der Namen, die den Typ des Objekts, nicht in den Namen des Objekts, der Raum selbst. Ich habe nicht wirklich finden, das erklärt, in der Python-docs, aber es kann leicht gesehen werden, in der Quellcode (nach der definition vonPyObject_GetIter()
).href="https://docs.python.org/2.7/reference/datamodel.html#new-style-special-lookup" >Spezielle Methoden blickte auf den Typ der Instanz, nicht auf die Instanz selbst. Wenn die Instanz einer Klasse, das bedeutet eine Besondere Methode ist, blickte auf die Metaklasse, nicht die Klasse selbst.
InformationsquelleAutor Sven Marnach
Können Sie Durchlaufen die Klasse sichtbaren Attribute, die mit
for attr in (elem for elem in dir(Foo) if elem[:2] != '__')
.Weniger schreckliche Art und Weise zu buchstabieren, ist:
dann
InformationsquelleAutor nmichaels
dies ist, wie wir ein Objekt der Klasse iterierbar. geben Sie die Klasse mit einem iter und eine next () - Methode, dann können Sie iterieren über Klassen-Attribute bzw. deren Werte.Sie können die next () - Methode, wenn Sie möchten, oder Sie können festlegen, next() und raise StopIteration auf eine bestimmte Bedingung.
e.g:
dieser Klasse iteriert über das Attribut value der Klasse Buch.
Ein Klasse-Objekt gemacht werden kann, durchsuchbar, indem es mit einem getitem Methode zu.
e.g:
nun, wenn das Objekt von BenTen Klasse wird verwendet, um eine for-in-Schleife -, getitem aufgerufen wird, succesively höheren index-Wert, bis es wirft IndexError.
book
imbook = Book(...)
); die Frage ist, über die iteriert Klasse - Attribute direkt (d.h. dieBook
imclass Book(object):
).Dies ist zwar nicht die Antwort auf Ops Frage, es hat mir geholfen, weil ich war auf der Suche für diese bei der Suche nach iterierbar Klasse.
InformationsquelleAutor vijay shanker
Als Python 3.4+, wodurch eine Klasse iterierbar ist ein bisschen einfacher mit
- enum.Enum
.InformationsquelleAutor A-B-B
InformationsquelleAutor sanit
Fügen Sie die
__iter__
zu der Metaklasse, anstatt die Klasse selbst (vorausgesetzt, Python-2.x):Für Python 3.x verwenden Sie
__iter__
Methode funktioniert nur für Instanzen der Klasse. Diese Unebenheiten der__iter__
Methode bis zu Instanzen der Metaklasse, d.h. die Klasse.__iter__
gesucht wird im Raum der Namen, die den Typ des Objekts, nicht in den Namen des Objekts, der Raum selbst. Ich habe nicht wirklich finden, das erklärt, in der Python-docs, aber es kann leicht gesehen werden, in der Quellcode (nach der definition vonPyObject_GetIter()
).@classmethod
auf dieFoo
Klasse? @nmichaels Antwort nicht erklären, denke ich. ` @classmethod def __iter__(cls): for x in xrange(10): yield x `Können Sie Durchlaufen die Klasse sichtbaren Attribute, die mit
for attr in (elem for elem in dir(Foo) if elem[:2] != '__')
.Weniger schreckliche Art und Weise zu buchstabieren, das ist:
dann
dies ist, wie wir ein Objekt der Klasse iterierbar. geben Sie die Klasse mit einem iter und eine next () - Methode, dann können Sie iterieren über Klassen-Attribute bzw. deren Werte.Sie können die next () - Methode, wenn Sie möchten, oder Sie können festlegen, next() und raise StopIteration auf eine bestimmte Bedingung.
e.g:
dieser Klasse iteriert über das Attribut value der Klasse Buch.
Ein Klasse-Objekt gemacht werden kann, durchsuchbar, indem es mit einem getitem Methode zu.
e.g:
nun, wenn das Objekt von BenTen Klasse wird verwendet, um eine for-in-Schleife -, getitem aufgerufen wird, succesively höheren index-Wert, bis es wirft IndexError.
book
imbook = Book(...)
); die Frage ist, über die iteriert Klasse - Attribute direkt (d.h. dieBook
imclass Book(object):
).Als Python 3.4+, wodurch eine Klasse iterierbar ist ein bisschen einfacher mit
- enum.Enum
.