Python 在同一个 class 的 __init__ 中键入允许某个 class 的对象

Python typing allow object of a certain class in the __init__ of that same class

我正在尝试创建一个名为 Theme 的 class,其 __init__ 函数允许传入另一个可能属于 Theme 类型的对象。但是当我尝试键入提示允许该类型的对象时,Python 会抛出错误,因为 Theme 尚未定义。这是代码,当我取出类型提示时它起作用:

from typing import Union


class Theme:

    def __init__(self, start: Union[dict, Theme, None] = None):
        if start is None:
            start = {}
        elif isinstance(start, Theme):
            start = start.dict
        self.dict = start

我得到的错误是:

Traceback (most recent call last):
  File "C:/Users/.../Test.py", line 4, in <module>
    class Theme:
  File "C:/Users/.../Test.py", line 6, in Theme
    def __init__(self, start: Union[dict, Theme, None] = None):
NameError: name 'Theme' is not defined

我有什么办法可以做到这一点,还是根本不可能,我不应该费心?

您可以从 __future__ 导入注释。我认为在 3.10 中这是默认可用的。

from __future__ import annotations

from typing import Optional


class MyClass:
    def __init__(self, cls: Optional[MyClass]) -> None:
        if cls:
            print(isinstance(cls, MyClass))


c = MyClass(None)
b = MyClass(c)