Добавление 2 объектов класса Python вместе - PullRequest
0 голосов
/ 14 октября 2018

У меня проблемы с добавлением двух объектов класса вместе.Это код, данный мне, который запустит 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 (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    

Это вернет правильное значение для набора м3.Но это также изменит значение self.M для набора m1.Как я могу вернуть что-то отличное от self, которое сделает hlls [int (m3)] и экземпляр класса HyperLogLog со слитым значением self.M?

Если я просто верну функцию Sum, hlls [int (m3)] больше не является экземпляром класса HyperLogLog.

Если я изменяю self.M, как я, я изменяю значение self.M для hlls [int (m1)].

Если я сделаю что-то вроде:

    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

Значение self.M экземпляра hlls [int (m1)] все еще изменяется.Я не понимаю почему.

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Когда вы делаете это:

self2=self

И self, и self2 указывают на один и тот же объект, поэтому, когда один из них изменяется, другой также изменяется.Самым простым решением было бы создать новый объект HyperLogLog, чтобы заменить строку выше на:

self2=HyperLogLog()
0 голосов
/ 14 октября 2018

Это не создает новый экземпляр объекта.Он просто присваивает другое имя тому же объекту.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...