我有两个类 - 一个继承自另一个.我想知道如何转换(或创建一个新的变量)子类.我已经搜索了一下,大部分都是"向下倾斜",这似乎是不受欢迎的,并且有一些稍微狡猾的解决方法,比如设置实例.上课 - 虽然这似乎不是一个好方法.
例如. 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 = ????????????
Run Code Online (Sandbox Code Playgroud)
编辑
感谢您的贡献....我担心我感觉相当沮丧(geddit?),因为到目前为止的答案似乎表明我花时间将转换器从一种类型编码到另一种类型.我已经提出了一种更自动的方法 - 基本上循环遍历类的属性并将它们相互转移.这对人们有什么味道 - 这是一件合理的事情 - 或者它会给你带来麻烦吗?
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
Run Code Online (Sandbox Code Playgroud)
你实际上并没有在Python中"强制转换"对象.相反,你通常会转换它们 - 拿走旧物体,创建一个新物体,扔掉旧物体.为了使其工作,新对象的类必须设计为在其__init__方法中获取旧对象的实例并执行适当的操作(有时,如果类在创建它时可以接受多种对象,它将为此目的有替代构造函数).
您确实可以通过将其__class__属性指向另一个类来更改实例的类,但该类可能无法与实例一起正常工作.此外,这种做法是恕我直言"气味",表明你应该采取不同的方法.
在实践中,您几乎不需要担心Python中的类型.(有明显的例外:例如,尝试添加两个对象.即使在这种情况下,检查也尽可能广泛;这里,Python会检查数字类型,或者可以转换为数字的类型,而不是一个特定的类型.)因此,对象的实际类是很重要的,只要它具有任何代码使用它所需的属性和方法.