constru中的可选参数副本

2024-10-01 04:57:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在设计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), ...)

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

能更好吗


Tags: 方法selfsizeinitvaluedefcallbacktable