我正在设计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), ...)
我最喜欢这个选项,因为它对未来可能的后继者是透明的,允许分别处理多个参数(一个可以是独占的而另一个不是)。
可以更好吗?