私には2つのクラスがあります。1つはもう1つを継承します。サブクラスにキャストする(またはの新しい変数を作成する)方法を知りたいです。私は少し検索しましたが、ほとんどの場合、このような「ダウンキャスト」は眉をひそめているようです。インスタンスの設定など、少し危険な回避策がいくつかあります。クラス-これは良い方法ではないようですが。
例えば。 http://www.gossamer-threads.com/lists/python/python/871571 http://code.activestate.com/lists/python-list/311043/
サブ質問-ダウンキャストは本当に悪いですか?もしそうなら、なぜですか?
以下にコード例を簡略化しました。基本的に、x、yデータの分析を行った後にPeakオブジェクトを作成するコードがあります。このコードの外では、データが「PSD」データパワースペクトル密度であることがわかっています。したがって、いくつかの追加の属性があります。ピークからPsd_Peakにダウンキャストするにはどうすればよいですか?
"""
Two classes
"""
import numpy as np
class Peak(object) :
"""
Object for holding information about a peak
"""
def __init__(self,
index,
xlowerbound = None,
xupperbound = None,
xvalue= None,
yvalue= None
):
self.index = index # peak index is index of x and y value in psd_array
self.xlowerbound = xlowerbound
self.xupperbound = xupperbound
self.xvalue = xvalue
self.yvalue = yvalue
class Psd_Peak(Peak) :
"""
Object for holding information about a peak in psd spectrum
Holds a few other values over and above the Peak object.
"""
def __init__(self,
index,
xlowerbound = None,
xupperbound = None,
xvalue= None,
yvalue= None,
depth = None,
ampest = None
):
super(Psd_Peak, self).__init__(index,
xlowerbound,
xupperbound,
xvalue,
yvalue)
self.depth = depth
self.ampest = ampest
self.depthresidual = None
self.depthrsquared = None
def peakfind(xdata,ydata) :
'''
Does some stuff.... returns a peak.
'''
return Peak(1,
0,
1,
.5,
10)
# Find a peak in the data.
p = peakfind(np.random.rand(10),np.random.rand(10))
# Actually the data i used was PSD -
# so I want to add some more values tot he object
p_psd = ????????????
編集
貢献してくれてありがとう....これまでの答えは、あるクラスタイプから別のクラスタイプへのコンバーターのハードコーディングに時間を費やしていることを示唆しているようです。私はこれを行うためのより自動化された方法を考え出しました-基本的にクラスの属性をループし、それらを互いに転送します。これは人々にどのように匂いを嗅ぎますか-それは合理的なことですか-それとも先に問題を引き起こしますか?
def downcast_convert(ancestor, descendent):
"""
automatic downcast conversion.....
(NOTE - not type-safe -
if ancestor isn't a super class of descendent, it may well break)
"""
for name, value in vars(ancestor).iteritems():
#print "setting descendent", name, ": ", value, "ancestor", name
setattr(descendent, name, value)
return descendent