将2个python类对象加在一起

时间:2018-10-14 10:04:58

标签: python python-3.x function class object

在将两个类对象加在一起时遇到一些问题。 这是给我的代码,它将运行MY文件,HyperLogLog和示例文本文件:

import HyperLogLog
import sys

hlls = [HyperLogLog.HyperLogLog() for _ in range(5)]

with open(sys.argv[1], "r") as file:
for line in file:
    cleanLine = line.replace("\n", "")
    (cmd, set, value) = cleanLine.split(" ")[:3]
    # See if this was an add, count, or merge command
    if cmd == "A":
        hlls[int(set)].add(value)
    elif cmd == "C":
        estimate = hlls[int(set)].count()
        print("Estimate:", estimate, "Real count:", value)
    elif cmd == "M":
        (cmd, m1, m2, m3) = cleanLine.split(" ")
        hlls[int(m3)] = hlls[int(m1)] + hlls[int(m2)]

最底行是合并hlls(设置为m1)和hlls(设置为m2)。 hlls(set x)存储单个参数M,这是我的HyperLogLog向量。我需要做一个 add 函数使上面的附加行起作用。我这样做如下:

class HyperLogLog:

def __init__(self):
    self.M = [0 for x in range(m)]   

##############
Code altering the self.M
##############

def __add__(self, other):
    Sum=other.M
    for i,value in enumerate(other.M):
        if value<self.M[i]:
            Sum[i]=self.M[i]
    self.M=Sum

    return self    

这将为m3设置返回正确的值。但这也会改变设置m1的self.M值。我如何返回除self之外的东西,这些东西将使hlls [int(m3)]和HyperLogLog类的实例具有合并的self.M值?

如果我只返回Sum函数,则hlls [int(m3)]不再是HyperLogLog类的实例。

如果像我一样更改self.M,则会更改hlls [int(m1)]的self.M值。

如果我做类似的事情:

    def __add__(self, other):
        Sum=other.M
        for i,value in enumerate(other.M):
            if value<self.M[i]:
                Sum[i]=self.M[i]

        self2=self
        self2.M=Sum


        return self2

实例hlls [int(m1)]的self.M值仍然更改。我不明白为什么。

2 个答案:

答案 0 :(得分:0)

这不会创建新的对象实例。只是为同一对象分配了另一个名称。

self2=self

您应该在HyperLogLog方法中创建一个新的__add__对象。 像这样:

def __add__(self, other):
    retval = HyperLogLog()
    retval.M = [max(a, b) for a, b in zip(self.M, other.M)]
    return retval

答案 1 :(得分:0)

执行此操作时:

self2=self

selfself2都指向同一个对象,因此当一个更改时,另一个也会更改。最简单的解决方法是创建一个新的HyperLogLog对象,因此您将上面的行替换为:

self2=HyperLogLog()