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 仍然在定义时评估注解;在这种情况下,它仍然是未定义的。
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
我正在重用一个流行的 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 仍然在定义时评估注解;在这种情况下,它仍然是未定义的。
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