gpt4 book ai didi

python - 实例化一个 TypeVar 类型

转载 作者:行者123 更新时间:2023-12-01 01:06:04 25 4
gpt4 key购买 nike

作为一名 C++ 程序员,以下代码对我来说似乎很自然,但它无法运行:

from typing import TypeVar, Generic, List, NewType

TPopMember = TypeVar('TPopMember')
Population = NewType('Population', List[TPopMember])
class EvolutionaryAlgorithm(Generic[TPopMember]):
def __init__(self, populationSize: int) -> None:
# The following raises TypeError: 'TypeVar' object is not callable
self.__population = Population([TPopMember() for _ in range(populationSize)])

显然,Python 无法实例化实际上是 TypeVar 的类(TPopMember)。我只是想创建一个列表(Population),其中包含几个默认初始化的(在 Python 中怎么说?)TPopMember。我该怎么办?

我使用的是 Python 3.7.2。

最佳答案

您没有意识到类型提示是一个提示。换句话说,根本不认为它是一种类型。您无法实例化它们。

据我从您的评论中了解到,您的意图是做 C++ 模板允许您做的事情。所以这是我实现这一目标的方法:

from typing import TypeVar, Generic, List, NewType, Type
import random

class PopMember:
def __init__(self):
self.x = random.randint(0, 100)
def __repr__(self):
return "Pop({})".format(self.x)

TPopMember = TypeVar("TPopMember")
Population = NewType('Population', List[TPopMember])

class EvolutionaryAlgorithm(Generic[TPopMember]):
def __init__(self, member_class: Type[TPopMember], populationSize: int) -> None:
self.__population = Population([member_class() for _ in range(populationSize)])
def __repr__(self):
return "EA({})".format(self.__population)

x = EvolutionaryAlgorithm(PopMember, 5)
print(x)

输出:

EA([Pop(49), Pop(94), Pop(24), Pop(73), Pop(66)])

您必须了解的是,如果您从 Generic[T] 派生了一个类,则在创建类时需要以某种方式使用 T。在我的示例中,我创建一个虚拟对象并解析其类并启动它。通常我不会以这种方式编写,我可以将一个类作为参数放入,将一个类传递给构造函数以请求生成此特定类型的项目,因为类本身与它的实例不同,是也是一个Python对象。 (感谢切普纳的建议)

关于python - 实例化一个 TypeVar 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55345608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com