在python中键入类的实例
在python中键入类的实例,python,python-3.x,typing,python-typing,Python,Python 3.x,Typing,Python Typing,Type[SomeType]是否有一个反函数,以便实例[Type[SomeType]]==SomeType 给我一个类,我想注释调用其构造函数的返回值 class FixedSizeUInt(int): 大小:int=0 定义新(cls,值:int): cls_max:int=cls.max_value() 如果不是0我相信你想要: new: Callable[[Type[FixedSizeUInt], int], FixedSizeUInt] = ... 或者更动态一点: from typi
Type[SomeType]
是否有一个反函数,以便实例[Type[SomeType]]==SomeType
给我一个类,我想注释调用其构造函数的返回值
class FixedSizeUInt(int):
大小:int=0
定义新(cls,值:int):
cls_max:int=cls.max_value()
如果不是0我相信你想要:
new: Callable[[Type[FixedSizeUInt], int], FixedSizeUInt] = ...
或者更动态一点:
from typing import TypeVar, Callable
T = TypeVar('T')
...
def __new__(cls: Type[T], value: int):
...
new: Callable[[Type[T], int], T] = ...
尽管如此,类型反转的问题仍然存在。也许接下来的问题是:泛型是否会覆盖所有情况,从而永远不需要反函数
这不是泛型,而是一般的类型提示。以int
为例int
是类int()
创建类的实例。在类型提示中,int
表示int
的实例。使用类作为类型提示总是谈论该类型的实例,而不是类本身。因为谈论类的实例是更典型的情况,所以谈论类本身就不太常见
所以,您需要在类型提示中使用类,而类型提示中的类意味着该类的实例。从逻辑上讲,不需要实例[int]
类型提示,因为您不能从非实例类型提示开始。相反,对于您想要谈论类的特殊情况,需要一个特殊类型提示type[int]
。您能澄清一下您想要在这里注释什么吗?\uuuu new\uuuu
的返回值只是FixedSizeUInt
。是否要参数化cls
的类型,使其适用于所有子类?这是否回答了您的问题@是的,没错。我需要它是泛型的,这样它就可以用于子类,正如您看到的,size变量被设置为零,所以如果不将其子类化并将其更改为零以外的值,则使用该类是没有意义的。您能澄清一下编辑的含义吗?如果您的问题与另一个问题有足够的不同,则将重新打开该问题T
字面意思是“类型的实例T
”,因此给定cls:type[T]
aT
也是“a实例[type[T]]
”(如果定义了这样的东西)。这是否足以涵盖所有情况,从而不需要instance[type[T]
?第一个选项是否适用于子类?否,这就是为什么要使用TypeVar
来代替。为了澄清,我同意Instance[int]
没有任何意义,我说的是Instance[cls]
wherecls:Type[int]
这样,您就不需要为示例中所示的简单情况设置类型变量。cls
不是一个静态类型提示,它不能由静态类型检查器计算。只有在运行时,cls
才会收到一个值(恰好是一个类),只有在该值之后才能对其进行计算。这就是为什么您需要cls:
,以便能够谈论“cls
具有的任何类型”。
from typing import TypeVar, Callable
T = TypeVar('T')
...
def __new__(cls: Type[T], value: int):
...
new: Callable[[Type[T], int], T] = ...