构造函数

时间:2018-04-11 00:03:13

标签: python api

我正在设计API。我有一个存储一些大表的类:

class TableHolder:
    def __init__(self, table, ...):
        self.table = table

我想避免用户混淆,并在构造函数中制作表的副本。

class TableHolder:
    def __init__(self, table, ...):
        self.table = list(table)

问题是我有很多生成这样的表的方法和函数,并立即创建TableHolder返回它。这些函数本身不存储表,并且在这种情况下不需要在构造函数中复制。

class TableHolder:
    def __init__(self, table, ...):
        self.table = list(table)

    @classmethod
    def generate(cls, size, callback):
        table = [callback(x) for x in range(size)]
        return cls(table, ...)

所以我正在寻找一种方法来告诉构造函数不要复制。当然,最简单的解决方案是单独的标志:

class TableHolder:
    def __init__(self, table, table_exclusive=False, ...):
        if not table_exclusive:
            table = list(table)
        self.table = table

我不喜欢它。它向最终用户暴露了一些与课堂目的无关的功能,并且可能会使一些内容完全混淆。

class TableHolder:
    def __init__(self, table, ...):
        self.internal_init(list(table), ...)

    @classmethod
    def _new_exclusive(cls, table, ...):
        self = cls.__new__(cls)
        self.internal_init(table, ...)

    def internal_init(self, table, ...)
        self.table = table

这在课堂上看起来很糟糕,但在课堂外有一个很好的界面。

我找到的最后一个选项是表格的一些标记:

class TableHolder:
    class exclusive:
        def __init__(self, value):
            self.value = value

    def __init__(self, table, ...):
        if isinstance(table, self.exclusive):
            table = table.value
        else:
            table = list(table)
        self.table = table

    @classmethod
    def generate(cls, size, callback):
        table = [callback(x) for x in range(size)]
        return cls(cls.exclusive(table), ...)

我最喜欢这个选项,因为它对未来可能的后继者是透明的,允许分别处理多个参数(一个可以是独占的而另一个不是)。

可以更好吗?

0 个答案:

没有答案