【发布时间】:2018-08-24 20:06:45
【问题描述】:
我有一个 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。
问题
如何重写这段代码来实现这一点,哪一种是最好的方法?我应该为Data 对象重写__add__ 方法还是为DataTypeA 和DataTypeB 重载__add__ 方法?
【问题讨论】:
标签: python pandas object sum overloading