You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现继承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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 23:15:54