为了账号安全,请及时绑定邮箱和手机立即绑定

Python 3.7类实例的静态字典

Python 3.7类实例的静态字典

互换的青春 2022-10-11 21:11:50
我正在重用一个流行的 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 definedfrom typing import Dictclass Zzz:    elements: Dict[str,Zzz] = {} <---- here
查看完整描述

2 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

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

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


查看完整回答
反对 回复 2022-10-11
?
偶然的你

TA贡献1841条经验 获得超3个赞

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

Pep563涵盖了这一点:

from __futures__ import annotations


查看完整回答
反对 回复 2022-10-11
  • 2 回答
  • 0 关注
  • 116 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号