【问题标题】:Adding 2 python class objects together将2个python类对象加在一起
【发布时间】:2018-10-14 10:04:57
【问题描述】:

我在添加两个类对象时遇到了一些问题。 这是给我的代码,它将运行我的文件、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(set m1) 和 hlls(set 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 集返回正确的值。但它也会改变 set 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 的值仍然改变。我不明白为什么。

【问题讨论】:

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


    【解决方案1】:

    当你这样做时:

    self2=self
    

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

    self2=HyperLogLog()
    

    【讨论】:

    • 谢谢,这很有道理。我还发现,我正在改变他的“其他”对象以及“自我”。我真是个小笨蛋:-)
    【解决方案2】:

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

    self2=self
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      • 2018-10-16
      相关资源
      最近更新 更多