我正在研究一个由两部分组成的问题:
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>