2016-04-15 10 views
0

ich eine Klasse erstellen möchten, die wie folgt aussieht:Erstellen Sie eine Klasse mit einem „ndarray“ -Attribut

class MyStructure: 
    def __init__(self, ndarray_type): 
     self.data = ndarray_type 

Und ich möchte ein Objekt dieser Klasse als Argument für andere Klassen zu übergeben. Zum Beispiel:

class Edit: 
    def __init__(self, structureObject): 
     self.data = structureObject 

    def Gray(self, image): 
     r,g,b = image[:,:,0], image[:,:,1], image[:,:,2] 
     gray = 0.2989*r + 0.5870*g + 0.1140*b 
     return gray 

Edit: Ich erhalte eine Fehlermeldung, wenn ich laufen diese:

from matplotlib.image import imread 
im = imread('filename.jpg') 
temp1 = MyStructure(im) 
temp2 = Edit(temp1) 
result = temp2.Gray(temp1) 

Traceback (jüngste Aufforderung zuletzt):

Zeile 1: Ergebnis = temp2.Gray (TEMP1)

Zeile 5 in Gray: r, g, b = Bild [:,:, 0], image [:,:, 1], image [:,:, 2]

AttributeErr oder: Meinestruktur Instanz hat kein Attribut ‚getitem

+0

Was genau den Fehler verursacht ? Es gibt keinen Aufruf für MyStructure in Ihrem Codebeispiel? Werfen Sie auch einen Blick in die Klassenvererbung: https://docs.python.org/2/tutorial/classes.html#inheritance, Es ist keine Lösung für Ihr Problem, nur eine andere Methode, die Sie je nach Umständen verwenden können. – armatita

+1

Du vermisst etwas .... Wie @armatita sagte. Was verursacht den Fehler? Wie auch immer, füge 'def __getitem __ (self, index) hinzu: gib selb.data [index]' an 'MyStructure' ... Es könnte helfen. – RicLeal

+0

'image' ist eine Instanz von' MyStructure', die keinen '[..]' Zugriff implementiert. Was ist Deine Absicht ? – rocksportrocker

Antwort

0

image ist eine Instanz MyStructure, die nicht [..] Zugang nicht implementiert. Sie haben eine __getitem__ Methode von MyStructure zu implementieren, die diesen Zugriff auf Ihre data Attribut leitet diese aktivieren:

class MyStructure: 
    def __init__(self, ndarray_type): 
     self.data = ndarray_type 
    def __getitem__(self, *a): 
     return self.data.__getitem__(*a) 

Was ist Ihre Absicht?

0

Sie erhalten Fehler, weil Sie versuchen, ein Objekt der Klasse Meinestruktur als Objekt der Klasse numpy.ndarray zu behandeln und das ist nicht wahr. Die Daten, die Sie r, g, b zuweisen möchten, befinden sich im Attribut Daten des Objekts der Klasse MyStructure. Attribut Daten ist eine Instanz von numpy.darray.

Wenn es immer noch nicht klar ist, vielleicht wird dies dazu beitragen:

temp1.__class__ # result: <class '__main__.MyStructure'> 
temp1.data.__class__ # result: <class 'numpy.ndarray'> 

, damit es funktioniert, können Sie die Definition der Methode Grau ändern:

def Gray(self, image): 
    r,g,b = image.data[:,:,0], image.data[:,:,1], image.data[:,:,2] 
    gray = 0.2989*r + 0.5870*g + 0.1140*b 
    return gray 
Verwandte Themen