2016-07-26 11 views
0

私はastropyライブラリからfits.open()で読み込んだフィットファイルを扱っています。私はastropy.io.fits.hdu.image.PrimaryHDUのインスタンスであるhdu(ヘッダデータユニット)を取得します。母クラス属性でインスタンスを初期化する

特定のプロジェクトでは、このhduのデータを特定の方法で作成したいと考えています。それを行う良い方法は、私はPrimaryHDUのサブクラスになる自分のクラスを書いていると思っていました。私の新しいオブジェクトには、PrimaryHDUインスタンスのすべての属性とメソッド、および属性とメソッドを記述します。しかし、私はそれが適切に動作するようにすることはできません。私の新しいオブジェクトはどのようにして親オブジェクトのすべての属性とメソッドを取得できますか?私が来た最も近い(例えば、新しいメソッド呼び出しが「引く」と、)次のコードである:

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 

それは一種のokですが、私はその私の新しいオブジェクトdoesnのを見ることができます実際のコードを見ると、元のオブジェクト(hdu)と同じ値に設定されたすべての属性を持っています...実際には私のコードを見ると普通のようですが、どうすれば新しいオブジェクトをすべての属性で初期化できますか?親オブジェクト?私は新しいクラスをPrimaryHDUクラスから継承するように修正しますか? ありがとう

+1

あなたは、Python 2または3を使用していますか? – DeepSpace

答えて

0

親オブジェクトのすべての属性で新しいオブジェクトを初期化するにはどうすればよいですか?

できません。インスタンス(つまりオブジェクト)から継承しないで、クラスを継承します。

あなたがしなければならないことは、親クラスとサブクラスの両方を初期化するために必要なすべての引数を渡すことです。その後、子クラスの__init__メソッド呼び出しsuper().__init__(親クラスの__init__法)と子クラスの残りの部分を初期化するには:

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

確かに、大丈夫です。私はオブジェクトとクラスを実際に混乱させていました。ありがとう。しかし:super(PrimaryHDU、self).__ init __(args_to_init_PrimaryHDU_obj)とは異なります:PrimaryHDU .__ init __(args_to_init_PrimaryHDU_obj)? – samR

+0

@samRこれは、使用しているPythonのバージョンによって異なります。Python 2を使用する場合は、 'PrimaryHDU'が古いスタイルのクラスであるか新しいスタイルのクラスであるかによって異なります。 – DeepSpace

関連する問題