独特的物品和内在的

时间:2018-06-13 22:46:07

标签: python-3.x inheritance python-3.6

我正在解决两个部分的问题:

1)创建一个类Foo(),它根据传入的单个值' x'创建唯一的实例。如果尝试使用相同的' x'创建多个实例。价值,那么只应保留第一个。

Foo()正常工作。

2)创建一个继承自Foo()的类Bar()。它应该执行与Foo()相同的工作(仅限唯一项),但允许两个变量,' x'并且' y'。

这是奇怪的部分。我得到了第1部分工作。 - 我正在做第2部分 - Shazam! - 第2部分似乎正在运作。但是,我不知道为什么。我不认为我有'' y'检查部分编码,但看起来整个事情都有效。有人可以看看这个并告诉我为什么第2部分有效吗?

从对象f1 - f5,有两个独特的项目。

从对象f6 - f13,有四个独特的项目。

总计:6个独特的项目,这是我运行时得到的。但我不知道基于传入的唯一性如何' y'参数正在完成。

我的代码:

seenx = {}
# seeny = {}


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

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


f1 = Foo.new(10)
f2 = Foo.new(10)
f3 = Foo.new(20)
f4 = Foo.new(10)
f5 = Foo.new(20)

s = {f1, f2, f3, f4, f5}

for i in s:
    print(i)


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

    @classmethod
    def new2(cls, x, y):
        return super().new(x).new(y)


f6 = Bar.new2(10, 'abc')
f7 = Bar.new2(10, 'abc')
f8 = Bar.new2(20, 'xyz')
f9 = Bar.new2(10, 'abc')
f10 = Bar.new2(20, 'xyz')
f11 = Bar.new2(10, 'def')
f12 = Bar.new2(20, 'ghi')
f13 = Bar.new2(20, 'ghi')

s2 = {f6, f7, f8, f9, f10, f11, f12, f13}

for i in s2:
    print(i)

输出:

<__main__.Foo object at 0x0D704F30>
<__main__.Foo object at 0x0D704EF0>
<__main__.Foo object at 0x0D722090>
<__main__.Foo object at 0x0D722030>
<__main__.Foo object at 0x0D722050>
<__main__.Foo object at 0x0D722070>

1 个答案:

答案 0 :(得分:0)

这是一个使用__new__方法进行此实例跟踪的类。

class Foo:
    _instances = {}
    def __new__(cls, *args):
        if args not in cls._instances:
            cls._instances[args] = super().__new__(cls)
        return cls._instances[args]
    def __init__(self, x):
        self.x = x

class Bar(Foo):
    _instances = {}
    def __init__(self, x, y):
        super().__init__(x)
        self.y = y