作为一个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不能示例化类(TPopMember),这些类实际上是TypeVars。我只想创建一个列表(Population),其中包含两个默认初始化的(Python中怎么说?)TPopMember。我应该怎么做呢?
我用的是Python 3.7.2。
4条答案
按热度按时间2izufjch1#
你没有意识到类型提示是一个提示。换句话说,不要认为它是一个类型。你不能示例化它们。
我从你的评论中了解到,你的意图是做C++模板允许你做的事情。所以这里是我实现这一目标的方法:
输出:
你需要理解的是,如果你从
Generic[T]
派生了一个类,你需要在创建类的时候使用T
。在我的例子中,我创建了一个伪对象,解析它的类并初始化它。通常我不会这样写。我可以直接把类作为参数传递给构造函数来请求生成这个特定类型的项因为类本身,不同于它的示例,也是Python对象(感谢chepner的建议)wxclj1h52#
您可以执行以下操作:
用于定义泛型类的类型可以在下面的示例中找到:* * 一月一日**
对于类方法,只需使用-〉
cls.__args__[0]
hgqdbh6s3#
还有另一种可能性可以避免序列化类时出现的问题(即使用pickle)。
您可以执行以下操作,而不使用“通用”:
这将避免很多问题,而不是黑客攻击python内部。
这里的主要优点是可以重用classmethod函数。
pw136qt24#
更简单的解决方案是在 enum 工厂中使用 functools.partial: