Мелкая копия объекта (экземпляр класса) - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь понять мелкие копии (ссылки).

Я создал класс, который должен делать мелкие копии экземпляра, если он уже существует, но мой код создает отдельные экземпляры.

Цель заключается в том, что если я попытаюсь создать новый объект с тем же значением x, что и существующий объект, я должен создать ссылку на существующий объект, а не новый объект.

from copy import copy


class Foo(object):
    def __init__(self, x):
        seen = set()
        if x not in seen:
            self.x = x
            seen.add(x)
        else:
            self.x = copy(self.x)


f1 = Foo(10)
f2 = Foo(10)
f3 = Foo(10)

s = {f1, f2, f3}

for i in s:
    print(i)

Это дает:

<__main__.Foo object at 0x03B21110>
<__main__.Foo object at 0x03AFB5B0>
<__main__.Foo object at 0x03B21150>

У меня должен быть только один объект в наборе (в данном случае), так как все объекты были созданы с одинаковым значением x.

1 Ответ

0 голосов
/ 12 июня 2018

Вы создаете поверхностную копию Foo.x, но вы печатаете объекты Foo, а не ссылки, которые вы создали.Попробуйте изменить свой оператор print () следующим образом:

print(hex(id(i.x)))

Это вернет ссылку на объект Foo, если вы уже создали его для этого значения x:

seen = {}


class Foo:
    def __init__(self, x):
        self.x = x

    @classmethod
    def new(cls, x):
        if x not in seen:
            seen[x] = cls(x)
        return seen[x]


f1 = Foo.new(10)
f2 = Foo.new(10)
f3 = Foo.new(10)

s = {f1, f2, f3}

for i in s:
    print(i)
...