2016-04-07 5 views
0

Ich arbeite an einem Projekt, das ich einige Objekte dynamisch aus einer Klasse erstellen muss. Ich fordere niemanden auf, es zu lösen, sondern zeige mir nur die richtige Richtung. Ein Beispiel wäre, wenn ich mit Hunden arbeiten würde.Versuch, ein Objekt aus einer Klasse durch Aufruf einer Funktion zu erstellen

Ich möchte jedoch eine Funktion haben, dass ich diese Informationen weitergeben kann, die ein globales Objekt erstellen würde. Die Funktion würde wie folgt aussehen:

def create_dog(name, age, gender): 
    name = Dog(name,age, gender) 
    return(name) 

So theoretisch, wenn ich den Namen „Jack“ an die Funktion übergeben hätte ich ein Objekt global „Jack“ aus der Klasse genannt. Ich versuche nur, einen guten Weg zu finden, dies zu tun, wenn überhaupt. Wenn das komplett gegen Python ist werde ich einen anderen Weg finden aber ich sitze hier fest. Ich habe auch über das Verschachteln der Klasse innerhalb meiner Funktion nachgedacht, aber der Namespace wird nicht in global gehen.

+0

Gibt es einen Grund für eine Reihe von globalen Objekten? Im Allgemeinen ist es am besten, wenn möglich globale Objekte zu vermeiden, da der Code sehr schwer zu debuggen sein kann. – mxdg

+1

Nicht 100% sicher, was Sie fragen, aber mögliche Duplikate von [Wie mache ich variable Variablen in Python?] (Http://stackoverflow.com/q/1373164/953482). Kurze Version: Es ist fast nie eine gute Idee, eine Funktion 'create_dog (" Jack ", 5," männlich ") zu haben, die eine Variable im globalen Bereich erstellt, deren Name" Jack "ist. – Kevin

Antwort

0

Sie ein globales Wörterbuch

dogs = {} 

def create_dog(name, age, gender): 
    # maybe check if already exists 
    dogs[name] = Dog(name, age, gender) 
+0

Ich habe mich darauf eingestellt, genauso wie es sauberer ist und nicht mit dem "Lecken" zwischen Namespaces per se umgehen muss. – kaceymusgraves

0

Vielleicht möchten Sie einen alternativen Konstruktor erstellen?

class Dog(object): 
    """Creating Dogs""" 
    def __init__(self, name, age, gender): 
     super(Dog, self).__init__() 
     self.name = name 
     self.name = age 
     self.name = gender 


    @classmethod 
    def create_dog(name, age, gender): 
     name = Dog(name,age, gender) 
     return name 

Siehe Diskussion auch Meaning of @classmethod and @staticmethod for beginner?

Ein globales Wörterbuch ist in Ordnung, wenn Sie eine einzelne Datei Skript verwenden, aber für eine komplexere Software erhalten Sie alle drei Elemente importieren müssen:

from dogs import dogs, create_dog, Dog 

Mit dem Klassenattribut importieren Sie nur einen Namensraum. So könnten Sie dies tun:

class Dog(object): 
    """Creating Dogs""" 

    members = [] 

    def __init__(self, name, age, gender): 
     super(Dog, self).__init__() 
     self.name = name 
     self.name = age 
     self.name = gender 


    @classmethod 
    def create_dog(name, age, gender): 
     name = Dog(name,age, gender) 
     Dog.members.append(name) 
     return name 

Jetzt können Sie einfach import Dog und Zugriff auf das Klassenattribut Dog.members

+0

Danke Oz. Ich werde definitiv viel mehr dazu lesen. Ich denke, ich werde mich für dieses Beispiel dem Wörterbuch zuwenden, aber ich bin ein paar Mal auf diese Frage gestoßen. – kaceymusgraves

+0

Sie könnten den Konstruktor ändern, um die Klasse zu aktualisieren, und Sie haben keine globale Variable, sondern ein Klassenattribut. – Oz123

0

Mit wechselnden schaffen könnte Einheimischen: (welche ist immer noch schlecht, aber nicht so viel wie das Ändern globals)

def create_dog(name, age, gender, locals_=locals()): 
    dog = Dog(name, age, gender) 
    locals_[name] = dog 


create_dog("jack", 3, "male") 
print(jack) 
+0

Danke, Sir, für den Hinweis. – kaceymusgraves

Verwandte Themen