代码之家  ›  专栏  ›  技术社区  ›  MarkS

独特的物品和本质

  •  -1
  • MarkS  · 技术社区  · 7 年前

    我正在研究一个由两部分组成的问题:

    1)创建一个类foo(),该类基于单个传入值“x”创建唯一实例。如果试图使用相同的“x”值创建多个实例,则只应保留第一个实例。

    foo()工作正常。

    2)创建从foo()继承的类bar()。它应该执行与foo()相同的工作(仅限唯一项),但允许两个变量“x”和“y”。

    这是奇怪的部分。我让第一部分工作。我在写第二部分的时候-沙扎姆!-第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 回复  |  直到 7 年前
        1
  •  0
  •   Patrick Haugh    7 年前

    __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