我有一个类Data
,我想重载__add__
函数,并根据我求和的对象的类型来获取不同类型的对象。
Data
类如下:
class Data(object):
def __str__(self):
s = "Data type " + self.type + ": " + self.tag
return s
def __init__(self, tag=""):
self.type = ""
self.tag = tag
self.df = pd.Series()
def createRandomData(self, amountData=10, sizeData=100):
self.df = pd.DataFrame(np.random.randint(0,sizeData,size=(amountData, 1)))[0]
def __add__(self, other):
data = Data()
data = Data(self.tag + "+" + other.tag)
data.df = self.df + other.df
return data
我还有两个不同的对象DataTypeA
和DataTypeB
,它们继承自Data
。
class DataTypeA(Data):
def __init__(self, tag=""):
Data.__init__(self, tag)
self.type = "A"
class DataTypeB(Data):
def __init__(self, tag=""):
Data.__init__(self, tag)
self.type = "B"
因此,我想确保当我对相同类型的数据(例如:DataTypeA
+ DataTypeA
)中的两个对象求和时,结果也是该类型的数据。但是,当两个对象属于不同类型(例如:DataTypeA
+ DataTypeB
)时,结果应为Data
对象。
总和的结果应该是df
中Series的总和,并且标签应该是第一个对象与“ +”串联的标签,最后是第二个标签。
现在,如果我运行以下代码:
a = DataTypeA("data1")
a.createRandomData()
b = DataTypeB("data2")
b.createRandomData()
a2 = a+a
b2 = b+b
c = a+b
print a
print b
print a2
print b2
print c
我得到的结果是:
>>>
Data type A: data1
Data type B: data2
Data type : data1+data1
Data type : data2+data2
Data type : data1+data2
但是a2
(data1 + data1)的类型应为DataTypeA
,而不是Data
,而b2
(data2 + data2)的类型应为DataTypeB
而不是Data
。
如何重写此代码以实现此目的,这将是最好的方法?我应该改写__add__
对象的Data
方法还是改写__add__
和DataTypeA
的重载DataTypeB
方法?
答案 0 :(得分:0)
一种解决方案是按如下方式重载Data
对象__add__
方法:
class Data(object):
def __str__(self):
s = "Data type " + self.type + ": " + self.tag
return s
def __init__(self, tag=""):
self.type = ""
self.tag = tag
self.df = pd.Series()
def createRandomData(self, amountData=10, sizeData=100):
self.df = pd.DataFrame(np.random.randint(0,sizeData,size=(amountData, 1)))[0]
def __add__(self, other):
data = Data()
if type(self) == type(other):
if type(self) == DataTypeA:
data = DataTypeA(self.tag + "+" + other.tag)
data.df = self.df + other.df
elif type(self) == DataTypeB:
data = DataTypeB(self.tag + "+" + other.tag)
data.df = self.df + other.df
else:
data = Data(self.tag + "+" + other.tag)
data.df = self.df + other.df
return data
其余代码将保持不变。
因此,如果您运行问题中提到的相同示例代码,输出将是:
>>>
Data type A: data1
Data type B: data2
Data type A: data1+data1
Data type B: data2+data2
Data type : data1+data2