Python - class 中的静态方法创建那个 class 的实例

Python - static method in class creating instance of that class

我有 Python 数据 class 从 JSON 创建(实际上有很多)。我想要一种从 JSON.

创建 class 实例的方法

我有这样的东西:

class FromJSONMixin:
    @staticmethod
    @abstractmethod
    def from_json(json: Union[Dict, TypedDict], **kwargs):
        raise NotImplementedError


class PatientJSON(TypedDict):
    ID: str
    Name: str
    Description: str
    BirthDate: str


@dataclass
class Patient(FromJSONMixin):
    name: str
    birth_date: str
    description: str

    @staticmethod
    def from_json(json: PatientJSON, **kwargs) -> Patient:
        return Patient(
        name=json["Name"],
        birth_date=json["BirthDate"],
        description=raw_data["Description"])

我想从 PatientJSON 创建 Patient 个对象(结构与现有数据库相关,我必须与之集成;它还做了一些名称属性翻译,如您可以看上面)。我创建了 FromJSONMixin 来显式标记 classes 可以从相关的 classes 为 JSONs 创建(比如 PatientJSON)。

问题: -> Patient: 部分出现错误,Unresolved reference 'Patient'。为什么?我不能在同一个 class 的方法中键入 class 对象?我是否必须放弃输入 return 类型?

这是创建具有良好类型注释的模块时的常见问题。问题是当 python 解释器正在解析用于创建 class 患者的代码时。方法Patient.from_json的return类型注解引用了classPatient,处于中间解析,尚未创建。要解决此问题,您通常会在 return 注释中用引号将 class 名称括起来,使其成为一个字符串。但是现在 MyPy 和其他类型检查器出现了问题。他们不允许字符串 return 注释,所以这是一个很好的解决方案:

class MyClass(SomeOtherClass):
    def __init__(self, param_a):
        self.attr_a = param_a
    
    def foo(self, bar: MyClass) -> MyClass:
        return MyClass(self.attr_a + 1)

这将引发未解决的引用错误。

要解决此问题,您可以将方法 return 注释用引号引起来

class MyClass(SomeOtherClass):
    def __init__(self, param_a):
        self.attr_a = param_a
    
    def foo(self, bar: 'MyClass') -> 'MyClass':
        return MyClass(self.attr_a + bar.attr_a)

这将有助于提高可读性,但不适用于 MyPy 等类型检查器。 所以对于像 MyPy 这样的跳棋你可以做一个 TypeVar。

from typing import TypeVar, Type

MyClassT = TypeVar('MyClassT', bound='MyClass')

class MyClass(SomeOtherClass):
    def __init__(self, param_a):
        self.attr_a = param_a
    
    def foo(self, bar: Type[MyClassT]) -> MyClassT:
        return MyClass(self.attr_a + bar.attr_a)