2016-06-30 10 views
0

Wie eine Klasse zu machen, ein Objekt in der folgenden Art und Weise zurück:Wie kann eine Klasse ein Objekt zurückgeben, wenn nach der Initialisierung auf die Klasse verwiesen wird?

import numpy as np 

a = np.array([(1,2),(3,4)]) 

Wenn a verwiesen wird, gibt es

array([[1, 2], 
     [3, 4]]) 

Allerdings, wenn ich eine einfache Klasse erstellen:

class Example: 
    def __init__(self, data): 
     self.nparray = np.array(data) 

Und run b = Example([(1,2),(3,4)]) dann Referenz b Ich bekomme: <__main__.Example at 0x7f17381099e8>. Um den Wert zurückzugeben, muss ich b.nparray ausführen.

Wie die Klasse Example Rückkehr machen

array([[1, 2], 
     [3, 4]]) 

wenn b verwiesen wird?

Ich versuchte mit Methoden wie __new__, __repr__ und __getitem__ jedoch keine das gewünschte Verhalten produziert.

+0

_ "Immer wenn' a' aufgerufen wird, gibt es zurück ... "_Huh? Es gibt das nicht auf meiner Maschine zurück. Wenn ich Ihren ersten Codeblock ausführe und dann 'a()' tue, bekomme ich 'TypeError: 'numpy.darray' -Objekt ist nicht aufrufbar'. – Kevin

+0

Dafür gibt es keine Klassen oder was "Call" bedeutet. – user2357112

+0

Ich verstehe nicht, warum Leute abwerten - OP ist nur in der Terminologie verwirrt. ** Calling ** bedeutet das: 'a()', aber wenn du sagst, dass du "a" "anrufst", meinst du, du referenzierst nur "a". –

Antwort

2

Sie __repr__ in der folgenden Art und Weise verwendet werden soll:

class Example: 
    def __init__(self, data): 
      self.nparray = np.array(data) 
    def __repr__(self): 
      return repr(self.nparray) 

Dadurch wird die Darstellung der self.nparray Objekt in:

>>> c = Example([(1, 2), (3, 4)]) 
>>> c 
array([[1, 2], 
     [3, 4]]) 

Natürlich ist diese und während der interaktiven Sitzungen verwendet wird, wo man einfach Geben Sie den Namen ein und drücken Sie die Eingabetaste und wenn Sie es mit print(c) drucken. Wenn Sie nur auf print Aufrufe beschränken möchten, definieren Sie __str__ für das Objekt in Frage.

+1

Danke! Ich habe 'repr()' vermisst, als ich '__repr__' benutzte. – Greg

2

Mit Pythons "magischen Methoden", wie die __init__, die Sie bereits gesehen haben, können wir die Klasse veranlassen Code auszuführen, wenn bestimmte Dinge passieren. Eine davon ist __call__, die ausgeführt wird, wenn die Klasse wie eine Funktion aufgerufen wird.

Mit diesem Wissen, können Sie diesen Code verwenden:

import numpy as np 

class Example: 
    def __init__(self, data): 
     self.nparray = np.array(data) 

    def __call__(self): 
     # This function is called when an instance of Example is called 
     return self.nparray 

Das Ergebnis dieser:

>>> b = Example([[1, 2], [3, 4]]) 
>>> b() 
array([[1, 2], 
     [3, 4]]) 

Weitere Informationen über magische Methoden finden this useful article.

+0

Das funktioniert gut, wenn OP buchstäblich die Beispiel-Instanz aufruft, die er erstellt, wie in 'b = Beispiel (...); print (b()) '. Aber ich denke, dass OP eine ungewöhnliche Definition von "call" verwendet, die etwas mehr wie "wenn ich" b "auf einer Zeile für sich selbst in den interaktiven Interpreter" eingeben. Also will er 'b = Beispiel (...); print (b) 'um das Array zu zeigen. – Kevin

+0

@kevin Das stimmt. Ich werde die Antwort hier sowieso für zukünftige Google-Mitarbeiter hinterlassen. –

+0

Leider scheint '__call__' nicht mit numpigen Objekten zu funktionieren. Es scheint immer noch '<__ main __ zurückzugeben. Beispiel bei 0x7fc23007f898>'. – Greg

0

Sie können keine Daten aus einer Klasse init Funktion zurückgeben. Haben Sie versucht, etwas wie:

class Example(object): 
    nparray = None 
    def __init__(self, data): 
     self.nparray = np.array(data) 
     return 

    def getArray(self): 
     return(self.nparray) 
+0

Dies gibt '<__ main __. Beispiel bei 0x7f2fdd455240>' zurück, wenn auf a verwiesen wird. – Greg

Verwandte Themen