首页 > 解决方案 > Python 3.7 类实例的静态字典

问题描述

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

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

标签: pythonpython-3.xpython-typing

解决方案


您可以前向引用您的类型,将其定义为字符串。

from typing import Dict

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

顺便编辑一下,你可以很容易地自动填充这个实现__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

推荐阅读