Python3.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)

Python3.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,python-3.x,python-typing,Python,Python 3.x,Python Typing,在我添加类型注释之前,它工作得很好,现在python抱怨Zzz是未知类型:NameError:name'Zzz'未定义 from typing import Dict class Zzz: elements: Dict[str,Zzz] = {} <---- here 从键入import Dict开始 Zzz类: 元素:Dict[str,Zzz]={}在注释被“读取”时,Zzz还不存在。Python 3.7仍然在定义时评估注释;在这种情况下,它仍然是未定义的 这包括: 注释“已

在我添加类型注释之前,它工作得很好,现在python抱怨Zzz是未知类型:NameError:name'Zzz'未定义

from typing import Dict

class Zzz:
    elements: Dict[str,Zzz] = {} <---- here
从键入import Dict开始
Zzz类:

元素:Dict[str,Zzz]={}在注释被“读取”时,
Zzz
还不存在。Python 3.7仍然在定义时评估注释;在这种情况下,它仍然是未定义的

这包括:


注释“已读”时,
Zzz
尚不存在。Python 3.7仍然在定义时评估注释;在这种情况下,它仍然是未定义的

这包括:

您可以将您的类型定义为字符串

从键入import Dict开始
Zzz类:
元素:Dict[str,'Zzz']
编辑顺便说一句,您可以通过实现一个方法轻松地自动填充这个静态字典

Zzz类:
元素:Dict[str,'Zzz']={}
姓名:str
定义初始子类(cls,**kw):
cls.elements[cls.name]=cls
ZZZMPL类(Zzz类):
name='foo'
断言Zzz.elements['foo']是ZzzImpl
您可以将您的类型定义为字符串

从键入import Dict开始
Zzz类:
元素:Dict[str,'Zzz']
编辑顺便说一句,您可以通过实现一个方法轻松地自动填充这个静态字典

Zzz类:
元素:Dict[str,'Zzz']={}
姓名:str
定义初始子类(cls,**kw):
cls.elements[cls.name]=cls
ZZZMPL类(Zzz类):
name='foo'
断言Zzz.elements['foo']是ZzzImpl

使用字符串在3.7中起作用,在3.5中也会起作用。后者是我选择此响应时的一个因素。依我看,将类分为两个级别是一种过分的做法。在本例中可能是这样,但若你们有许多子类,那个么它就很方便了。例如,如果您有一个抽象基类,并且希望自动“注册”新的具体子类,并通过给定的静态变量x对它们进行索引。我经常使用这种模式来创建工厂静态方法或函数。使用字符串在3.7中有效,在3.5中也有效。后者是我选择此响应时的一个因素。依我看,将类分为两个级别是一种过分的做法。在本例中可能是这样,但若你们有许多子类,那个么它就很方便了。例如,如果您有一个抽象基类,并且希望自动“注册”新的具体子类,并通过给定的静态变量x对它们进行索引。我经常使用这种模式来创建工厂静态方法或函数。我想与python 3.5向后兼容,所以我选择了下面使用字符串文字的答案。我想与python 3.5向后兼容,所以我选择了下面使用字符串文字的答案。
from __futures__ import annotations