<pre><code>class Point(object):
__cache = {}
def __new__(cls, x, y):
if (x, y) in Point.__cache:
return Point.__cache[(x, y)]
else:
o = object.__new__(cls)
o.x = x
o.y = y
Point.__cache[(x, y)] = o
return o
>>> Point(1, 2)
<__main__.Point object at 0xb6f5d24c>
>>> id(Point(1, 2)) == id(Point(1,2))
True
</code></pre>
<p>当您需要一个真正简单的类,如<code>Point</code>,请始终考虑<code>collections.namedtuple</code></p>
^{pr2}$
<p>我在<code>namedtuple</code>旁边使用了一个函数,因为它在IMO中更简单,但如果需要,可以很容易地将其表示为类:</p>
<pre><code>class Point(namedtuple('Point', 'x y')):
__cache = {}
def __new__(cls, x, y):
return Point.__cache.setdefault((x, y),
super(cls, Point).__new__(cls, x, y))
</code></pre>
<p>正如@PetrViktorin在他的<a href="https://stackoverflow.com/a/16978210/1219006">answer</a>中指出的那样,您应该考虑使用<a href="http://docs.python.org/2/library/weakref.html#weakref.WeakValueDictionary" rel="nofollow noreferrer">^{<cd4>}</a>,因此删除的类实例(显然与<code>namedtuple</code>无关)不会保留在内存中,因为它们仍然在字典中被引用。在</p>