类中创建该类实例的Python静态方法

2024-05-29 02:28:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用JSON创建了Python数据类(实际上有很多)。我想要一个从JSON创建类实例的方法

我有这样的想法:

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来显式标记可以从JSON的相关类创建的类(如PatientJSON

问题:我发现-> Patient:部分Unresolved reference 'Patient'有一个错误。为什么?我不能在同一个类的方法中键入类对象?我必须放弃键入返回类型吗


Tags: 方法namefromjsondefdescriptionkwargsclass
1条回答
网友
1楼 · 发布于 2024-05-29 02:28:15

这是创建具有良好类型注释的模块时的常见问题。问题在于python解释器在解析用于创建类Patient的代码时。方法Patient.from_json的返回类型注释引用了类Patient,该类位于解析的中间,尚未创建。为了解决这个问题,通常在返回注释中用引号将类名括起来,使其成为字符串。但是现在MyPy和其他类型检查程序出现了问题。它们不允许字符串返回注释,因此有一个很好的解决方案:

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这样的checker,您可以创建一个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)

相关问题 更多 >

    热门问题