Python 使类常量为Who';s Type是它所在的类

Python 使类常量为Who';s Type是它所在的类,python,python-3.8,python-class,Python,Python 3.8,Python Class,我有一个Python类,它具有特殊的值“EMPTY”和“UNIVERSE”: 类重新设置: “”“连续打开、半打开和关闭区域以及实数的离散值”“” #实现占位符 定义初始化(self,interval,*,规范化): 通过 #课外 RealSet.EMPTY=RealSet(tuple(),canonicalize=False)#类型:ignore RealSet.UNIVERSE=RealSet((无,无),规范化=False)#类型:忽略 但是,linting、代码完成等不喜欢这样,因为它

我有一个Python类,它具有特殊的值“EMPTY”和“UNIVERSE”:

类重新设置:
“”“连续打开、半打开和关闭区域以及实数的离散值”“”
#实现占位符
定义初始化(self,interval,*,规范化):
通过
#课外
RealSet.EMPTY=RealSet(tuple(),canonicalize=False)#类型:ignore
RealSet.UNIVERSE=RealSet((无,无),规范化=False)#类型:忽略
但是,linting、代码完成等不喜欢这样,因为它们不被视为类的静态属性。即使设置它们也会报告为mypy错误,因此会出现
#type:ignore

以下内容不起作用,因为我无法在类范围中构造
实数集,因为它还不存在:

类重新设置:
“”“连续打开、半打开和关闭区域以及实数的离散值”“”
...
...
EMPTY=RealSet(tuple(),canonicalize=False)#错误
UNIVERSE=RealSet((无,无),规范化=False)#错误
这不起作用,因为它定义了实例属性,而不是类属性:

类重新设置:
“”“连续打开、半打开和关闭区域以及实数的离散值”“”
...
...
空:“RealSet”
宇宙:“实数集”
#课外
RealSet.EMPTY=RealSet(tuple(),canonicalize=False)
RealSet.UNIVERSE=RealSet((无,无),规范化=False)
这似乎是Python类设计中的一个关键问题。如果属性的类型是它所在的类,如何生成类属性?奖励:使它们保持不变。

您可以使用注释类变量:

class RealSet:
    def __init__(self, intervals, *, canonicalize):
        pass

    EMPTY: ClassVar['RealSet']
    UNIVERSE: ClassVar['RealSet']


RealSet.EMPTY = RealSet(tuple(), canonicalize=False)
RealSet.UNIVERSE = RealSet(((None, None),), canonicalize=False)
从Python3.9开始,可以修饰其他描述符,例如
属性
。这样就可以创建“类属性”:


您是否知道
Enum
?您计划如何使用该类?你的用例是什么?@PeterWood有趣。我不是,但我认为它会遇到与第二个代码块相同的问题。RealSet在类中还不存在。@iurii\n是您可能期望的典型情况,但也有一些我在现有实现中找不到的操作。例如,将数组作为输入并返回集合中包含在O(n log n)中的元素的索引。
class RealSet:
    def __init__(self, intervals, *, canonicalize):
        pass

    @classmethod
    @property
    def EMPTY(cls):
        return cls(tuple(), canonicalize=False)

    @classmethod
    @property
    def UNIVERSE(cls):
        return cls(((None, None),), canonicalize=False)