如何实现继承frozenset的Singleton单元素集合类?
实现Singleton单元素集合类:选子类化而非装饰器
要满足你提出的两个要求——继承frozenset以支持无缝集合操作、构造时校验输入长度为1——子类化是唯一简洁且合理的方案,装饰器无法实现继承关系,也就没法保证和set/frozenset的操作兼容性。
简洁实现代码
因为frozenset是不可变类型,实例的创建逻辑在__new__方法中,把校验逻辑放在__new__里更严谨:
class Singleton(frozenset): def __new__(cls, iterable): items = list(iterable) assert len(items) == 1, "构造Singleton必须传入长度为1的可迭代对象" return super().__new__(cls, items)
如果习惯用__init__(虽对不可变类型来说不是最佳时机),也可以这么写:
class Singleton(frozenset): def __init__(self, iterable): items = list(iterable) assert len(items) == 1, "构造Singleton必须传入长度为1的可迭代对象" super().__init__(iterable)
为什么不选装饰器?
装饰器本质是包装现有类/对象,无法让你的Singleton成为frozenset的子类,会引发两个核心问题:
- 无法无缝执行集合操作:比如
Singleton()和set()做交集时,返回的是frozenset实例而非Singleton,破坏类型一致性; - 类型检查不通过:
isinstance(Singleton(), frozenset)会返回False,不符合你要求的继承关系。
内容的提问来源于stack exchange,提问作者hwong557
相关产品推荐
相关产品推荐

