【问题标题】:How to return different type of objects overloading sum function in python?如何在python中返回不同类型的重载sum函数的对象?
【发布时间】: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

我还有两个不同的对象 DataTypeADataTypeB 继承自 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__ 方法还是为DataTypeADataTypeB 重载__add__ 方法?

【问题讨论】:

    标签: python pandas object sum overloading


    【解决方案1】:

    一种解决方案是重载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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多