Python 3.7 class 个实例的静态字典

Python 3.7 static dictionary of class instances

我正在重用一个流行的 c++ 习语,其中 class 包含 class 个实例的静态字典:

class Zzz:
    elements = {}

    def __init__(self, name):
        self._name = name
        Zzz.elements[name] = self

    @staticmethod
    def list_instances():
        for k in Zzz.elements.items():
            print(k)

在我添加类型注释之前它工作正常,现在 python 抱怨 Zzz 是一个未知类型:NameError: name 'Zzz' is not defined

from typing import Dict

class Zzz:
    elements: Dict[str,Zzz] = {} <---- here

当时注解是"read",Zzz还不存在。 Python 3.7 仍然在定义时评估注解;在这种情况下,它仍然是未定义的。

Pep563

from __futures__ import annotations

您可以 forward-reference 您的类型将其定义为字符串。

from typing import Dict

class Zzz:
    elements: Dict[str, 'Zzz']

Edit 顺便说一句,您可以轻松地自动填充此静态字典,实现 __init_subclass__() 方法。

class Zzz:
    elements: Dict[str, 'Zzz'] = {}
    name: str

    def __init_subclass__(cls, **kw):
        cls.elements[cls.name] = cls

class ZzzImpl(Zzz):
    name = 'foo'

assert Zzz.elements['foo'] is ZzzImpl