2016-07-26 15 views
0

Ich arbeite mit passt Dateien, die ich mit pass.open() aus der Astropy-Bibliothek gelesen. Ich bekomme eine hdu (Header-Dateneinheit), die eine Instanz von astropy.io.fits.hdu.image.PrimaryHDU ist.Initialisieren Instanz mit Mutter Klasse Attribute

Nun möchte ich für ein bestimmtes Projekt an den Daten in diesem HDU arbeiten, indem ich bestimmte Methoden schreibe. Ein guter Weg, es zu tun, dachte ich, schreibt meine eigene Klasse, die eine Unterklasse von PrimaryHDU wäre. Mein neues Objekt würde alle Attribute und Methoden der PrimaryHDU-Instanz sowie Attribute und Methoden enthalten, die ich schreiben werde. Aber ich kann es nicht richtig funktionieren. Wie kann mein neues Objekt alle Attribute und Methoden des übergeordneten Objekts erhalten? Die nächstgelegene ich gekommen, um mit dem folgende Stück Code (mit zum Beispiel ein neuer Methodenaufruf „subtrahieren“):

from astropy.io.fits.hdu.image import PrimaryHDU 

class MyHDU(PrimaryHDU): 

    def __init__(self, hdu): 
     PrimaryHDU.__init__(self, data=hdu.data, header=hdu.header) 

    def subtract(self, val): 
     self.data = self.data - val 

Es ist eine Art von Ordnung, aber ich kann sehen, dass mein neues Objekt doesn Habe nicht alle Attribute auf den gleichen Wert wie das ursprüngliche Objekt (hdu) .... was normal erscheint, wenn ich meinen Code tatsächlich anschaue ... aber wie kann ich mein neues Objekt mit allen Attributen des Elternobjekt? Und bin ich richtig, dass meine neue Klasse von der PrimaryHDU-Klasse geerbt wird? Danke

+1

Sind Sie mit Python 2 oder 3? – DeepSpace

Antwort

0

Wie kann ich mein neues Objekt mit allen Attributen des übergeordneten Objekts initialisieren?

Sie können nicht. Sie erben nicht von einer Instanz (dh einem Objekt), die Sie von einer Klasse erben.

Was Sie tun sollten, ist übergeben alle Argumente, die Sie benötigen, um sowohl die Eltern und die Unterklasse zu init. In der __init__ Methodenaufruf des Kindes Klasse super().__init__ (die __init__ Methode der Elternklasse) und dann den Rest des Kindes Klasse initialisieren:

from astropy.io.fits.hdu.image import PrimaryHDU 

class MyHDU(PrimaryHDU): 

    def __init__(self, args_to_init_PrimaryHDU_obj, hdu): 
     super().__init__(args_to_init_PrimaryHDU_obj) 
     # if using Python 2 the above line should be 
     # super(PrimaryHDU, self).__init__(args_to_init_PrimaryHDU_obj) 
     self.data = hdu.data 
     self.header = hdu.header 

    def subtract(self, val): 
     self.data = self.data - val 
+0

sicher, ok das macht Sinn. Ich habe das Objekt und die Klasse in der Tat verwechselt. Vielen Dank. Aber ist: super (PrimaryHDU, self) .__ init __ (args_to_init_PrimaryHDU_obj) unterscheidet sich von: PrimaryHDU .__ init __ (args_to_init_PrimaryHDU_obj)? – samR

+0

@samR Es hängt von der Version von Python ab, die Sie verwenden, und wenn Sie Python 2 verwenden, hängt es davon ab, ob "PrimaryHDU" eine alte oder eine neue Stilklasse ist. – DeepSpace

Verwandte Themen