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)
我有 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)