在Python中可以自引用类型吗

2024-05-16 06:07:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我想做些类似的事情:

@attr.s
class A(object):
    a_dict = attr.ib(factory=Dict, type=Dict[str, A], validator=optional(instance_of(Dict)))

可以像type=Dict那样键入它,但是我想知道您是否可以像type=Dict[str, cls]那样进行自我引用,但是它可能受到Python的限制。在

谢谢。在


Tags: ofinstance键入objectfactorytype事情validator
3条回答

如果我的解释是正确的,你想要的是:

from typing import Dict, Optional

import attr

from attr.validators import optional, instance_of


@attr.s
class A(object):
    a_dict = attr.ib(
        factory=dict,
        type=Optional[Dict[str, "A"]],
        validator=optional(instance_of(dict))
    )


A({"key": A(None)})

然后我就过去了。在

请注意:

  • 不能将typing.Dict用于factory,因为它实际上只是用于类型提示,如果尝试实例化它,则会失败。在
  • instance_of在内部使用isinstance(),虽然isinstance({}, Dict)是真的,但我不认为它是这样使用的。在
  • 如果根据验证器,一个dict是可选的,那么还需要使用类型注释将其包装在Optional[]中来声明它是可选的。在

clsself是按照约定给类及其实例的名称,当它们分别作为参数传递给类方法实例方法时。它们都不会被定义在你试图使用它们的地方。在

相反,您可能能够做的是将类型强制为a的非object超类,如果存在的话。在

问题是class A(object): A导致NameError: name 'A' is not defined。这意味着在类的定义块中创建类时,不能通过它的名称来引用它。在

我认为在键入时要避开这个问题,可以使用一个字符串:type=Dict[str, 'A']。我记得我把这看作是转发引用的方式,但这可能不对。在

相关问题 更多 >