2017-12-01 3 views
0

Ich habe den folgenden Code:Python: instantiaing ein Objekt innerhalb einer Methode

class Fish(): 
    def __init__(self, color, size): 
     self.color = color 
     self.size = size 

    def getInfo(self): 
     return self.size, self.color 


class Catch(): 

    def func1(self): 
     catFish = Fish('blue', 'big') 
     return catFish 

if __name__ == '__main__': 
    bob=Catch() 
    bob.func1() 
    catFish.getInfo() 

Wenn ich versuche, catFish.getInfo() bekomme ich folgende Fehler

Traceback (most recent call last): 
    File "test4.py", line 58, in <module> 
    catFish.getInfo() 
    NameError: name 'catFish' is not defined 

Ich gehe davon zu tun Dies liegt daran, dass die lokale Variable "CatFish" ausgegeben wird, wenn die Methode "func1" beendet wird. Gibt es eine Möglichkeit, ein Objekt in einer Methode zu instanziieren und nach dem Ende der Methode auf dieses Objekt zugreifen zu können?

+0

Der Code, den Sie tatsächlich gepostet haben, wird fehlschlagen, wenn 'func1' nicht definiert wird - soll das stattdessen' test' sein? Angenommen, Sie rufen 'Catch.test()' zu einem bestimmten Zeitpunkt auf, weisen Sie den Rückgabewert einer Variablen zu - das können Sie '.getInfo()' on nennen. – jasonharper

+0

Whoops Tippfehler gerade behoben – user2734815

Antwort

3

Ich nehme an, dies liegt daran, dass die lokale Variable CatFish ausgegeben wird, wenn die Methode func1 beendet wird.

Ja, Ihre Annahme ist richtig.

Oder um genau zu sein, der NamecatFish geht aus dem Geltungsbereich, sobald die Methode endet. Das bedeutet, dass das unterliegende Objekt nicht mehr unter dem Namen catFish erreichbar ist, aber das Objekt noch irgendwo im Speicher sitzt. Sie können es für Code außerhalb der Methode verfügbar machen, indem Sie es zurückgeben und ihm einen anderen Namen geben.

In diesem Codebeispiel geben Sie das zuvor als catFish bekannte Objekt aus der func1()-Methode zurück, aber Sie geben ihm keinen neuen Namen. Um dies zu tun, würden Sie nur

new_name = bob.func1() 

schreiben müssen Dann haben Sie Zugriff auf das gleiche Objekt, das catFish genannt wurde, wenn es in dem Verfahren ist, jetzt genannt new_name.

Im Allgemeinen möchten Sie vielleicht über variable scoping lesen, um zu verstehen, wo Sie einen bestimmten Namen für den Zugriff auf ein Objekt verwenden können und wann der Name nicht mehr gültig ist.

+0

Sehr informativ, danke. – user2734815

0

Variable CatFish liegt außerhalb des Gültigkeitsbereichs und bedeutet, dass es innerhalb einer Methode definiert ist, sodass kein Code außerhalb dieser Methode darauf zugreifen kann.

+0

Ich realisiere dies, aber sicherlich muss es eine Möglichkeit geben, ein Objekt innerhalb einer Methode zu instanziieren und außerhalb der Methode zugänglich zu sein. – user2734815

Verwandte Themen