亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 133 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號