Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中键入类的实例_Python_Python 3.x_Typing_Python Typing - Fatal编程技术网

在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]
a
T
也是“a
实例[type[T]]
”(如果定义了这样的东西)。这是否足以涵盖所有情况,从而不需要
instance[type[T]
?第一个选项是否适用于子类?否,这就是为什么要使用
TypeVar
来代替。为了澄清,我同意
Instance[int]
没有任何意义,我说的是
Instance[cls]
where
cls: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] = ...