У меня есть класс 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
и тег должен быть тегом первого объекта, объединенного с «+», и, наконец, второго тега.
Пример
К настоящему времени, если я выполню следующий код:
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
вместо этого?