使Factory构造函数看起来像Python

时间:2018-01-27 12:40:24

标签: python constructor factory

背景是我有一个与坐标系相关联的单元格,我想在运行中创建它们。每个点都有一个独特的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)])

0 个答案:

没有答案