【发布时间】:2021-09-27 16:13:23
【问题描述】:
来自 C# 背景并了解其泛型类型方法,我现在正尝试在 Python 中实现类似的东西。我需要以特殊的字符串格式对类进行序列化和反序列化,因此我创建了以下两个基类,第一个用于单个实体序列化,第二个用于该实体类型的列表序列化。
from typing import Any, TypeVar, List, cast, Type, Generic, NewType
import re
T = TypeVar('T')
class Serializable(Generic[T]):
def to_str(self) -> str:
raise NotImplementedError
@classmethod
def from_str(cls, str: str):
raise NotImplementedError
class SerializableList(List[Serializable[T]]):
def __init__(self):
self.separator: str = "\n"
@classmethod
def from_str(cls, str: str):
list = cls()
for match in re.finditer(list.separator, str):
list.append(T().from_str(match)) # <-- PROBLEM: HOW TO INIT A GENERIC ENTITY ???
# list.append(Serializable[T].from_str(match)) <-- Uses base class (NotImplemented) instead of derived class
return list
def to_str(self) -> str:
str = ""
for e in self:
str = str + f"{e.to_str()}{self.separator}"
return str
然后我可以从这些类派生并且必须实现to_str 和from_str。请查看标记 。我不知道如何为列表初始化当前使用类型的新实体。我们如何以 Python 方式执行此操作?
【问题讨论】:
-
Python 泛型更接近 Java 而不是 C# - 它们几乎完全用于静态分析。许多信息在运行时不可用。
-
我对 Python 还很陌生。有更好的方法吗?我认为我尝试实现的过程非常简单。具有两个派生方法的基类和相同类型实体的列表。会有很多必须实现基类的派生类。如何做到这一点?
标签: python generics python-typing