背景是我有一个与坐标系相关联的单元格,我想在运行中创建它们。每个点都有一个独特的Cell,如果它有一个,但会有很多点没有。如果我只能说 Cell(),那么编码和使用会更容易,如果存在,我会自动获得预先存在的一个,如果不存在,我会自动获得新的一个。
我可以使用像这样的工厂构造函数
class Cell():
lookup = {}
index = -1 # index is a one-up counter to distinguish objects
def __init__(self,coord):
Cell.index += 1
self.index = Cell.index
self.coord = coord
Cell.lookup[coord] = self
def __repr__(self):
return "{}<{}>".format(self.__class__.__name__,self.index,self.coord)
@classmethod
def factory(self,coord):
try:
return Cell.lookup[coord]
except KeyError:
return Cell(coord)
# This creates four different Cells
print([Cell(i) for i in (0,1,0,1)])
# but this creates only two
print([Cell.factory(10+i) for i in (0,1,0,1)])
但我觉得它不美观,我可能会不小心直接使用 Cell 构造函数。
我可以隐藏 Cell 作为另一个类
class _Cell():
lookup = {}
index = -1
def __init__(self,coord):
_Cell.index += 1
self.index = _Cell.index
self.coord = coord
_Cell.lookup[coord] = self
def __repr__(self):
return "{}<{}>".format(self.__class__.__name__,self.index,self.coord)
@classmethod
def factory(self,coord):
try:
return _Cell.lookup[coord]
except KeyError:
return _Cell(coord)
def Cell(coord):
return _Cell.factory(coord)
# This creates only two different Cells
print([Cell(i) for i in (0,1,0,1)])
但现在我没有创建 Cell 类型的对象。有没有办法让我想要美观和安全的构造函数?
发布编辑 ..我没有将此识别为备忘录的应用程序。谢谢那个做过的人。此代码有效
_memoized = {}
def memoize(f):
"""
A special-case memoizer
"""
def memoized(*args):
key = (*args,)
if key not in _memoized:
_memoized[key] = f(*args)
return _memoized[key]
return memoized
@memoize
class Cell():
index = -1
def __init__(self,coord):
self.__class__.index += 1
self.index = self.__class__.index
self.coord = coord
def __repr__(self):
return "{}<{}>".format(self.__class__.__name__,self.index,self.coord)
# This creates only two different Cells
print([Cell(i) for i in (0,1,0,1)])