我正在解决两个部分的问题:
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>
答案 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