当前位置: 首页 > 面试题库 >

类型提示,用于正在定义的类型的对象

鲁丰
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)

我确信这是一个已知的范例,因为这似乎是一个非常常见的分层类使用问题(一个自引用类)。我知道我可以its_parent_org_unit将be的类型更改为object有效,但是这样做似乎是错误的事情,主要是因为它削弱了我检查呼叫类型的能力。随着its_parent_org_unit改变是一种类型的object我得到正确的结果:

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

我愿意考虑和提出建议。做这种事情的最“ pythonic”方法是什么?

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


问题答案:

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

类型提示PEP(0484)解释说,您可以使用类型名称的字符串版本作为前向引用。这个例子的Tree数据结构听起来与此非常相似OrgUnit

例如,这有效:

class OrgUnit(object):

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

在Python 3.7,你将能够激活注释推迟评价用from __future__ import annotations。这将自动将注释存储为字符串,而不是对其进行评估,因此您可以执行

from __future__ import annotations

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

按计划,它将成为Python 4.0中的默认设置。



 类似资料:
  • 我得到一个错误: 我确信这是一个已知的范例,因为它似乎是一个非常常见的层次类使用问题(自引用类)。我知道我可以将

  • 问题内容: class Node: def append_child(self, node: Node): if node != None: self.first_child = node self.child_nodes += [node] 我该怎么办?因为当我运行它时,它说。 我应该只删除and实例在函数中检查它吗?但是,我该如何访问的属性(我希望它是类的实例)? 我不知道如何在Python,

  • 如何将此迭代器与泛型类型一起使用?以下是我在“main”函数中尝试的方法: 结果是:<代码>无法从静态上下文引用非静态类项 结果是:<代码>无法从静态上下文引用非静态类项 结果: 编辑: 我调用的是类而不是方法。这项工作: 迭代器it=deq。迭代器(); 我认为,由于iterator()中返回的实例的类型是ListIterator,因此我需要使用该类型声明“it”。

  • 问题内容: 我想允许使用Python 3进行类型提示,以接受某个类的子类。例如: 现在,当输入以下代码时: 我得到一个PyCharm IDE提示“期望的类型A,取而代之的是Type [B]。” 如何更改此处的类型提示以接受A的任何子类型? 据此(https://www.python.org/dev/peps/pep-0484/#type-definition- syntax ,“该类型的参数也接受

  • 我希望允许使用Python 3进行类型提示以接受某个类的子类。例如。: 现在当键入以下代码时: 我收到一个 PyCharm IDE 提示“预期的类型 A,而是获得类型 [B]。 如何在这里更改类型提示以接受? 根据PEP 484(“类型为特定参数类型的子类型的表达式也可用于该参数。”),我知道我的解决方案< code>(cls: A)应该可以工作?

  • 问题内容: 我想在当前的Python 3.5项目中使用类型提示。我的函数应该接收一个函数作为参数。 如何在类型提示中指定类型函数? 我检查了PEP 483,但在那里找不到函数类型提示。 问题答案: 正如@jonrsharpe在评论中指出的,可以使用以下方法完成: 问题是,将其本身翻译为: 一个Callable接受 任意数量的/类型的 参数,并返回任何类型的值。在大多数情况下,这不是您想要的,因为您