当前位置: 首页 > 知识库问答 >
问题:

正在定义的类型为[duplicate]的对象的类型提示

南门飞
2023-03-14

我得到一个错误:

NameError: name 'OrgUnit' is not defined
class OrgUnit(object):

    def __init__(self,
                 an_org_name: str,
                 its_parent_org_unit: OrgUnit= None
                 ):
        self.org_unit_name = an_org_name
        self.parent_org_unit = its_parent_org_unit

    def __str__(self):
        if self.parent_org_unit:
            parent_org_unit_name = self.parent_org_unit.__str__()
            return parent_org_unit_name + "->" + self.org_unit_name
        else:
            return self.org_unit_name


if __name__ == '__main__':
    ibm_worldwide = OrgUnit("IBM_Worldwide")
    ibm_usa = OrgUnit("IBM_USA", ibm_worldwide)
    ibm_asia = OrgUnit("IBM_Asia", ibm_worldwide)
    ibm_china = OrgUnit("IBM_China", ibm_asia)
    print(ibm_worldwide)
    print(ibm_usa)
    print(ibm_asia)
    print(ibm_china)

我确信这是一个已知的范例,因为它似乎是一个非常常见的层次类使用问题(自引用类)。我知道我可以将的父组织单元的类型更改为对象,并且可以正常工作,但这似乎是错误的,主要是因为它妨碍了我在通话中检查类型的能力。通过将其上级组织单元更改为类型对象我得到了正确的结果:

IBM_Worldwide
IBM_Worldwide->IBM_USA
IBM_Worldwide->IBM_Asia
IBM_Worldwide->IBM_Asia->IBM_China

我愿意接受想法和建议。做这种事情最“蟒蛇”的方式是什么?

PS:这种“自引用类”范例/问题的名称是什么,我可以用它来查找其他建议?


共有1个答案

令狐昂雄
2023-03-14
匿名用户

您的问题是,您希望使用类型提示,但希望该类本身能够接受其自身类型的参数。

类型提示PEP(0484)说明可以使用类型名称的字符串版本作为转发引用。这里的例子是一个数据结构,它听起来与这个组织单元非常相似。

例如,这是有效的:

class OrgUnit(object):

    def __init__(self,
                 an_org_name: str,
                 its_parent_org_unit: 'OrgUnit' = None
                 ):

在Python 3.7中,您将能够使用来自导入注释的激活__future__注释的延迟计算。这将自动将注释存储为字符串,而不是计算它们,因此您可以执行

from __future__ import annotations

class OrgUnit(object):
    def __init__(self,
                 an_org_name: str,
                 its_parent_org_unit: OrgUnit= None
                 ):
        ...

这将成为Python 4.0中的默认设置。

 类似资料:
  • 问题内容: 我得到错误: 我确信这是一个已知的范例,因为这似乎是一个非常常见的分层类使用问题(一个自引用类)。我知道我可以将be的类型更改为有效,但是这样做似乎是错误的事情,主要是因为它削弱了我检查呼叫类型的能力。随着改变是一种类型的我得到正确的结果: 我愿意考虑和提出建议。做这种事情的最“ pythonic”方法是什么? PS:这种“自我引用类”范式/问题的名称是什么,我可以用它来查找其他建议吗

  • 以下代码不能按预期工作。显然,我不能在类定义中使用类自己的类型: 运行它的结果是: 此外,使用检查代码会返回: 如何将此代码更正为对Python和mypy有效?

  • 我想检查变量是否为类型。对于其他类型,我们可以执行以下操作: 但是对于来说,这种简单的方法是不可能的。也就是说,我们不能说。还有别的办法吗?为什么这对某些类型是可能的,而对其他类型是不可能的?非常感谢。

  • 我试图在Python3.5中使用类型提示。1,代码如下: 我猜在解析类型A时,类型A还没有完全构造,这是范围界定的问题,但我不理解为什么这样的语法不正确。是否有其他方式来表达它,或者它只是一个非法的构造? 我想在基类中使用这个语法提示,它可以在树状层次结构中组成派生类。

  • 问题内容: 我必须怎么做才能将自定义类型的对象用作Python字典中的键(我不希望“对象id”用作键),例如 如果名称和位置相同,我想将MyThing用作相同的键。从C#/ Java开始,我习惯于重写并提供一个equals和hashcode方法,并保证不会突变该hashcode依赖的任何内容。 我必须在Python中做什么才能完成此任务?我应该吗? (在一个简单的例子中,就像这里一样,也许最好将一

  • 问题内容: 就像我们使用__ToString一样,有没有一种方法来定义铸造方法? 问题答案: 无需在php中键入强制类型转换。 编辑: 由于这个话题似乎引起一些混乱,我想我要详细说明一下。 在Java之类的语言中,有两种可能带有类型。编译器有一个关于类型的概念,而运行时还有一个关于类型的想法。编译器的类型与变量相关,而运行时引擎则跟踪值的类型(已将其分配给变量)。变量类型在编译时是已知的,而值类型