我正在设计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), ...)
我最喜欢这个选项,因为它对未来可能的继任者是透明的,允许单独处理多个参数(一个可以是独占的,而另一个不能)
能更好吗
目前没有回答
相关问题 更多 >
编程相关推荐