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

如何使用泛型在 python 中返回类类型?

潘琨
2023-03-14

我正在使用泛型在python中创建一个List类(类似于java列表的列表)。类节点也是通用的,我正在为上一个和下一个节点创建 getter 和 setters 方法。我想知道如何返回像类节点本身这样的类型?这是我的进步:

from typing import Generic, TypeVar                                                                                                                                                           
T = TypeVar('T')                                                                                               
                                                                                                               
class Node(Generic[T]):                                                                                        
    ''' Generic class Node. It models a node for a linked list. '''                                            
                                                                                                               
    def __init__(self, element: T) -> None:                                                                    
        ''' Constructor. It recives an element of type T.'''                                                   
        self.element = element                                                                                 
        self.next = None                                                                                       
        self.prev = None                                                                                       
                                                                                                               
    def get_item(self) -> T:                                                                                   
        ''' Returns the item in the node.'''                                                                   
        return self.element                                                                                    
                                                                                                               
    def get_prev(self) -> #What is the type I should return here?:                                                                             
        ''' Returns the previous node.'''                                                                      
        return self.prev                                                                                       
                                                                                                               
    def get_next(self) -> #What is the type I should return here?:                                                                             
        ''' Return the next node.'''                                                                           
        return self.next                                                                                       
                                                                                                               
    def set_prev(self, prev) -> None:                                                                          
        ''' Changes the previous element to the specified node.'''                                             
        self.prev = prev                                                                                       
                                                                                                               
    def set_next(self, next) -> None:                                                                          
        ''' Changes the next element to the specified node.'''                                                 
        self.next = next       

我试过

    def get_prev(self) -> Node[T]:                                                                             
        ''' Returns the previous node.'''                                                                      
        return self.prev                                                                                       
                                                                                                               
    def get_next(self) -> Node[T]:                                                                             
        ''' Return the next node.'''                                                                           
        return self.next                                                                                                                                                                                                      

但它给了我错误

Traceback (most recent call last):
  File "List.py", line 5, in <module>
    class Node(Generic[T]):
  File "List.py", line 18, in Node
    def get_prev(self) -> Node[T]:
NameError: name 'Node' is not defined

共有1个答案

何长恨
2023-03-14

我认为最新的Python版本具有在类型注释中自引用类的能力(这里是当前正在定义的< code>get_prev的返回类型< code>Node)。

较旧的Python版本(低至3.7)仍然通过添加以下内容来支持它:

from __future__ import annotations

参见:https://peps.python.org/pep-0563/#enabling-未来的行动3-7

 类似资料:
  • 现在我希望以泛型的方式使用这些类。 如何从方法“method1”和“method2”返回泛型类型(可以是猫或狗)。我有几个返回“T extends Animal”的方法,所以最好在方法级别或类级别中声明泛型类型。

  • 对于一堆带有泛型的包装类,我的继承结构遇到了一些麻烦。这基本上是结构: 这将与当前代码一起编译和工作,但是,这似乎很危险。如果调用方像这样使用这个方法:,它将很好地编译,但是如果findMiddle尝试返回SubBWrapper,则在运行时会有一个ClassCastException。我以为行得通却行不通的是: 所以我的问题基本上是,有没有正确的方法来编写编译、运行并遵循最佳实践的方法findMi

  • 我试图创建一个返回泛型类型参数的方法。 我有一个类车辆订单扩展抽象类订单。在类订单中,我创建了一个抽象方法接收HiredObject。这个方法不会接收任何参数,并将返回一个泛型。 我在VehicleOrder类中实现了这个方法,并将其设置为返回类参数vehicle。 问题是,当我实例化一个新的VeilceOrderorororororororororororororderororororororo

  • 类具有类似类型的方法(让我们称其为收集器)。我认为这些方法可以通过使其返回一个包装泛型值的类来实现。 这是示例代码 此代码产生错误 我知道我可以通过使用泛型值创建收集器类来解决这个问题。我希望Collector类是单例的,我是指bean。所以我不能这么做。 有办法吗?

  • 我试图重写在子类中返回type as list的方法,如下例所示,由于泛型问题,我无法在子类中执行此操作。我无法更改我的超类代码,因此如何解决该问题?任何人都可以指引我。。。非常感谢。 无法更新的超类: 子类: