Как вернуть разные типы объектов, перегружающие функцию суммы в python? - PullRequest
0 голосов
/ 24 августа 2018

У меня есть класс 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 вместо этого?

1 Ответ

0 голосов
/ 24 августа 2018

Одним из решений будет перегрузка метода Data object __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
...