TypeError: 'type' - Objekt ist nicht durchsuchbar - Iteration über Objekt-Instanzen
Ich bin an einem Projekt arbeiten, und ich möchte, dass einer meiner Klassen durchsuchbar. Zu den besten meines Wissens, ich kann das mit metaclass.
Zunächst möchte ich verstehen, wie Metaklasse funktioniert. Daher möchte ich meine eigene üben Beispiel, wo ich aus einem Auto-Klasse. So, hier möchte ich gerne mein Auto die Objekte der Klasse iterierbar, dann würde ich gerne drucken die Namen von Ihnen in der main-Funktion.
Code-Beispiel ist das folgende:
__author__ = 'mirind4'
class IterableCar(type):
def __iter__(self):
return iter(self.__name__)
class Car(object):
__metaclass__ = IterableCar
def __init__(self, name):
self.name = name
if __name__=='__main__':
car1 = Car('Mercedes')
car2 = Car('Toyota')
for cars in Car:
print (cars.name)
Aber leider bekam ich eine TypeError:
TypeError: 'type' object is not iterable
Würden Sie so freundlich sein, mir zu sagen, wo ich den Fehler in meinem code? So weit ich habe ähnliches problem-Fragen über diese Website und das internet, aber ich weiß nicht, was das problem ist. Ich bin mit python 3.4.
Vielen Dank im Voraus!
for cars in Car
. Auto ist eine Klasse definition. Was erwarten Sie, das zu tun? Meinten Sie setzen car1
und car2
in eine Liste und Durchlaufen? (Ich sehe, Sie haben etwas an der Spitze, zu deiner Frage "macht eine Klasse iterierbar" aber es ist nicht klar, was Sie wollen. Car
scheint nicht zu vertreten jede Art von Sammlung.)Ich denke, dass OP es will Ausbeute
C - A - R
... Interessantes Konzept, macht eine iterierbar Klasse...Ich würde eigentlich vermuten, dass der OP möchte es zurückgeben von jeder Instanz, so weit erstellt, was ich bezweifle, ist möglich, aber wir werden sehen.
In Python 3 definieren Sie eine Metaklasse, mit
class Car(metaclass=IterableCar)
, nicht mit der __metaclass__
Attribut.Vorausgesetzt, der Metaklasse ist die Bereitstellung der definition von
__new__
glaube ich so.InformationsquelleAutor mirind4 | 2015-09-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Soweit ich das sagen kann, was ein Objekt der Klasse iterierbar durch die Verwendung einer Metaklasse, funktioniert Prima:
Ergebnisse in:
Hier ist ein Beispiel, wo ich tatsächlich verfolgen die Autos generiert:
Beachten Sie, dass wenn Sie mit Python ist3.x verwenden Sie eine Metaklasse, die Sie tun:
Statt:
was wahrscheinlich erklärt das problem, das Sie erleben.
weakref
- Modul verwendet werden kann, den Speicherverlust zu beheben.Yep
weakref.WeakSet
ist wahrscheinlich das am einfachsten zu bedienende Objekt gibt, könnte hier helfen, aber das ist aus dem Anwendungsbereich dieser Frage, glaube ich ... (da wir nicht wirklich wissen, was der OP versucht zu machen...)Aktualisiert mit einem
WeakSet
Leider verstehe ich nicht, warum das Programm musste das memory-leak problem, ohne die weakref Modul. Ist der Garbage-Collector funktioniert nicht in dieser situation? Um ehrlich zu sein, ich bin noch ein bisschen Anfänger bei diesem Thema, tut mir Leid. Würden Sie so freundlich sein, mir eine kurze Erklärung dafür? (Ich weiß, was memory-leak ist, aber ich weiß nicht, wo ist (war) es in mgilson code). Vielen Dank!
Wenn Sie halten eine Liste von Instanzen der Klasse level, es wird immer eine Referenz für jede Instanz jeder erstellt. Weil dieses, die Referenz-Zählung kann nie drop auf 0 und so wird das Objekt nie in der Lage sein werden, Müll gesammelt. Es ist möglich, dass das gewünschte Verhalten. Mit der
WeakSet
, wenn ein Objekt den Gültigkeitsbereich verlässt, es wird Müll gesammelt und der Klasse wird stop-tracking.InformationsquelleAutor mgilson
Verfolgen Instanzen der Klasse, die erstellt werden, wir werden beginnen, indem Sie eine
_cars
Attribut für jede Klasse erstellt, die von der Metaklasse. Diese Einstellung, die von schwachen Referenzen, so dass die Klasse sich nicht verhindern, dass ungenutzte Instanzen von einem garbage Collector entfernt wird.Hinzufügen der Instanzen, die wir überschreiben
__call__
. Im wesentlichen ist dies, wo Sie code, die Sie normalerweise legen Sie in__new__
oder__init__
bei der Definition der Klasse selbst.Zu machen und die Klasse iterierbar durch Iteration über seine Reihe von Instanzen,
Jede Klasse mit
IterableCar
wird automatisch verfolgen Sie Ihre Instanzen.Und, ich nehme an, für die Vollständigkeit, die Sie hinzufügen möchten
__iter__
als auch (das würde die Iteration zurückiter(cls._cars)
)Beide gute Punkte (übersehen der ersten, vergaß die zweite).
danke für deine ausführliche Antwort, ich Schätze es! 🙂
InformationsquelleAutor chepner