2017-07-07 6 views
1

Ich mache ein Programm für ein Schulprojekt. Es ist ein Model United Nations.Wie kann ich eine Klasseninstanz aus einer Liste erstellen? Python

countries = ['Australia', 'Brazil', 'Canada'] 

class delegate(object): 
    def __init__(self, country): 
    self.country = country 

Ich habe eine Liste mit Ländern und eine Klasse namens Delegate. Jedes Delegiertenobjekt muss also ein Land haben. Normalerweise würde ich es so machen:

mexico = delegate('Mexico') 

Und das wäre es. Aber ich würde gerne die Länderliste durchgehen und für jede Klasse Klasseninstanzen erstellen. Ich meine:

australia = delegate('Australia') 
brazil = delegate('Brazil') 
canada = delegate('Canada') 

und so weiter. Wie kann ich das machen? Vielen Dank !!

+0

Ich würde vorschlagen, dass Sie Ihre Auswahl für die Antwort neu bewerten, die Ihnen geholfen hat. Oder erklären Sie zumindest, warum diese Antwort Ihnen geholfen hat, das zu erreichen, wonach Sie suchen? Die Antwort von [this] (https://stackoverflow.com/a/44981035/1832539) trifft genau das, wonach Sie suchen. – idjaw

+0

@idjaw Hallo, Ich bin neu auf Python (auch Programmierung) und ich habe versucht, die Antwort, die Sie angegeben, und es zeigt einen Fehler, der, den ich wählte nicht. Ich wusste nicht warum, aber wenn du es mir erklären kannst, werde ich froh sein, meine Wahl zu ändern. Eigentlich hatte ich. Dies ist der Fehler, der angezeigt wird: Delegaten = {Land: Delegat (Land) für Land in Ländern} ^ SyntaxError: ungültige Syntax –

+0

Ich kopiere einfach eingefügt den Code und ich erhielt keinen Syntaxfehler. Ich schlage vor, Sie kopieren den Code und fügen Sie ihn in eine neue Python-Datei mit nichts anderem ein und versuchen Sie es erneut, um sicherzugehen. – idjaw

Antwort

8

Das Erstellen benannter Variablen aus einer Liste ist normalerweise eine schlechte Idee. Vielleicht könnten Sie

countries = ['Australia', 'Brazil', 'Canada'] 

class Delegate(object): # according to PEP8, class names should be title-case 
    def __init__(self, country): 
     self.country = country 

# create a dict 
delegates = {country: Delegate(country) for country in countries} 

bearbeiten versuchen: per @SethMMorton, 2.6 Python nicht Wörterbuch Comprehensions (also das, was ich oben verwendet) verstehen. Sie können das gleiche Ergebnis erhalten mit

+2

nit: py3 Hinweis für nicht * benötigt * von Objekt explizit zu erben -> 'Klasse Delegate:' sollte ausreichen. – idjaw

+0

Ich verstehe das Diktat nicht und wenn ich es in das Programm schreibe, zeigt es einen Syntaxfehler. Delegaten = {Land: Delegierter (Land) für Land in Ländern} ^ SyntaxError: ungültige Syntax –

+0

@ Arturo.Mart welche Version von Python verwenden Sie? Das funktioniert perfekt für mich in Python 3.5.3. –

1
[delegate(c) for c in countries] 
-3

Ich glaube, Sie suchen nach einer sogenannten anonymen Klasse. Dies bedeutet, dass Sie eine Klasse erstellen, ohne sie einer Variablen zuzuweisen. Beispiel:

country_delegates = [] 
for country in countries: 
    country_delegates.append(delegate(country)) 

Dies erstellt eine Liste der Delegiertenobjekte, eines für jedes Land. Wenn Sie den zu einem bestimmten Land gehörenden Delegierten erhalten möchten, könnten Sie eine Funktion schreiben, die diese Liste durchsucht und das Delegiertenobjekt für das richtige Land zurückgibt.

+1

Sie machen hier keinen anonymen Kurs. Du machst überhaupt keine Klasse *. Ich nehme an, du könntest den "Typ" -Konstrukteur quälen, um eine "anonyme Klasse" zu erschaffen, aber selbst dann nicht wirklich ... –

+0

Es ist sehr bedauerlich, dass dies angenommen wurde, was den zukünftigen Lesern eine sehr irreführende Anleitung bietet. – idjaw

+0

Könnten Sie näher ausführen? Wenn Sie eine Klasse namens "delegate" haben, funktioniert dieser Code gut. Ich dachte, eine anonyme Klasse wäre eine Klasse, die instanziiert wurde, ohne einer Variablen zugewiesen zu werden, ist das nicht richtig? – KAL

-1

können Sie exec:

countries=['australia','brazil','canada'] 
for country in countries: 
    exec('%s=delegate(%s.capitalize())'%(country,country)) 

dies wird eine neue Instanz von Delegierten machen und es wird auf seine richtigen Ländernamen zugeordnet werden. hoffe das hilft.

+0

das ist nicht sicher – saarrrr

+1

'ländern.append (" rm -rf /; abc ")' - ja, nicht Python per se, aber Sie bekommen die Idee. "Exec" sollte generell vermieden werden. –

+0

@HughBothwell True, obwohl dies eine gültige Lösung ist –

Verwandte Themen