2017-07-07 7 views
1

Ich habe eine Funktion in Python geschrieben, die ähnlich wie eine Factory in Java funktionieren soll, da sie die korrekte Klasse für die gegebenen Parameter instanziiert und diese Instanz zurückgibt.Zurückgeben einer Python-Objektinstanz einer inneren Klasse einer Funktion

Ein minimales Beispiel mit nur einer Klasse innerhalb der Funktion wäre dies:

def create_object(param): 

    class SpecialClass(ParentClass): 
     def func(self, param): 
      doSomething() 

    class_instance = SpecialClass(param) 
    return class_instance 

ich fehlerlos dieses Objekt verwenden kann, wenn ich diese Funktion von außen anrufen. Ich gehe davon aus, dass dies etwas mit der dynamischen Eingabe in Python zu tun hat, aber ich bin mir immer noch nicht sicher, warum das tatsächlich funktioniert. Ist der Bereich, in dem diese Klasse bekannt ist, nicht nur innerhalb der Funktion selbst bekannt?

+0

Ihre Frage ist nicht klar. Warum * würde es nicht funktionieren? Und warum sollte das etwas mit dynamischer Typisierung zu tun haben? –

+0

Ja, was hat es mit dynamischer Typisierung zu tun? Auch @DanielRoseman, er meint, dass in Java, der Umfang der Klasse und Objekte innerhalb einer Funktion nur auf dr innen ist ... aber Florian sagt, dass es nicht der Fall zu sein scheint –

+1

Ich kann immer noch nicht sehen was das mit dem Umfang zu tun hat. Sie geben ein Objekt von der Funktion zurück, und dieses Objekt kann auch in Java an eine beliebige Stelle übergeben werden. –

Antwort

3

Um Ihre Frage zu beantworten, haben Sie ein Objekt zurückgegeben, und Python wird Sie unabhängig davon, wo die ursprüngliche Klasse definiert wurde, verwenden. Es gibt keine privaten Klassen in Python und Funktionen selbst sind Objekte. Wenn Sie also das Objekt zurückgeben, sieht alles außerhalb dieser Funktion das Objekt als eine Instanz von create_object.SpecialClass.

In der Praxis obwohl Fabriken sind nicht etwas, das Sie in Python machen. Sie sollten eine Klassenmethode verwenden, die einfach eine Instanz der Klasse zurückgibt. Sie können mehr darüber lesen Sie hier: https://docs.python.org/3/library/functions.html#classmethod

Wenn Sie verwirrt sind nur google python classmethod decorator und es gibt einige gute Stackoverflow Erklärungen, wie man sie verwendet.

+0

Das ist nicht, was er gefragt hat. Er möchte wissen, dass es funktioniert hat, was er getan hat, das heißt, ein Objekt einer inneren Klasse zu benutzen, dessen Umfang begrenzt ist. Warum das Verhalten? –

+0

@AakashVerma, Ich habe aktualisiert, um das zu erklären, aber ich bin immer noch die Entmutigung von Fabriken zu machen, wie es ist unpythonal –

+0

Ich war halb erwartet, dies zu hören und ich bin wirklich froh, dass Sie mir gesagt haben.Ich werde sehen, ob ich meinen Code ändern kann, um so lesbar zu sein, wie es jetzt ist, während ich die Fabrikfunktion loswerde. Im übrigen denke ich, das beantwortet meine Frage. Vielen Dank! – Florian

-2

Excuse meine schreckliche Java, aber ich kann nicht sehen, wie Ihr Python-Code anders hieraus ist:

class NestedScope { 
    public static void main(String[] args) { 
     OuterClass oc = new OuterClass(); 
     oc.bar().foo(); 
    } 
} 

class OuterClass { 
    class InnerClass { 
    public void foo() { 
     System.out.println("in here"); 
    } 
    } 
    public InnerClass bar() { 
    return new InnerClass(); 
    } 
} 

Hier in der Hauptklasse I das Objekt der Klasse Innerclass referenzieren, ohne dass die Klasse immer in zu sein Bereich, und ich kann seine foo() Methode erfolgreich aufrufen.

+0

Wenn ich den Unterschied richtig mache, könntest du foo() zwar nicht ohne diese indirekte Methode aufrufen. Das liegt daran, dass Sie ein Objekt vom Typ InnerClass nicht deklarieren können, wenn Ihre NestedScope-Klasse es nicht kennt. Dazu müssten Sie auch die InnerClass importieren. Aber in Python habe ich nicht (und ich glaube nicht?) Diese Klasse sogar in meine Funktion importieren können. Also ja, ich sehe einen Unterschied. – Florian

+0

Ihr Code ist [hier] (https://ideone.com/eOE5iW) und es funktioniert, aber es ist völlig anders als das, worüber wir gesprochen haben. Das Erstellen von Objekten einer Klasse, die innerhalb einer Funktion der äußeren Klasse außerhalb der Funktion liegt, ist nicht der Fall, der von Ihrem Code dargestellt wird. Es kann nicht passieren, Mann. In Ihrem Code geht es darum, ein Objekt der inneren Klasse durch eine Funktion zu erzeugen und zurückzugeben, wenn sich die Klasse nicht in einer Funktion derselben Oberklasse befindet. und nicht auf der Außenseite das Objekt einer Klasse innerhalb einer Funktion zu schaffen. –

+0

Wenn Sie das Objekt einer Klasse innerhalb der Funktion erstellen müssen, müssen Sie es innerhalb der gleichen Funktion erstellen, und Sie können es nicht weitergeben. Verwenden Sie diese innere Klasse möglicherweise, um einen Getter für ein Feld der äußeren Klasse zu erstellen und dann ein Objekt zu erstellen und den Getter aufzurufen. All dies geschieht innerhalb der Funktion, in der die innere Klasse vorhanden ist. –

Verwandte Themen