微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

类型提示子类包含对其自身类型的其他实例的引用

如何解决类型提示子类包含对其自身类型的其他实例的引用

我正在尝试为二维链表创建基类。从功能的角度来看,下面的代码已经可以正常工作了。问题是,当我将 LinkedList2D 子类化以创建更具体的版本时,我的所有属性(向上、向下、之前、之后)和我的生成函数仍然将类型提示解析为 LinkedList2D 而不是更具体的子类,这是必要的,因为我想要访问它的附加属性方法

我有一种感觉,我需要以某种方式使用绑定泛型,但我似乎无法理解它。

class LinkedList2D:
    up: Optional[LinkedList2D]
    down: Optional[LinkedList2D]
    before: Optional[LinkedList2D]
    after: Optional[LinkedList2D]

    def __init__(self) -> None:
        self.up = None
        self.down = None
        self.before = None
        self.after = None

    def iterate_children(self) -> Generator[LinkedList2D,None,None]:
        link = self.down

        while link:
            yield link

            link = link.after

    def iterate_tree(self) -> Generator[LinkedList2D,None]:
        for child in self.iterate_children():
            if child:
                yield child

                yield from child.iterate_children()

    def get_children(self) -> List[LinkedList2D]:
        return list(self.iterate_children())

    def insert_under(self,op: LinkedList2D) -> bool:
        if op:
            if op.down:
                self.insert_before(op.down)

            op.down = self

        self.up = op

        return True

    def insert_under_last(self,op: LinkedList2D) -> bool:
        self.up = op

        if op:
            if op.down:
                last = self.get_children()[-1]

                self.insert_after(last)
            else:
                op.down = self

        return True

    def insert_after(self,obj: LinkedList2D) -> bool:
        if obj:
            if obj.after:
                obj.after.before = self

                obj.after = self

            self.after = obj.after

            self.up = obj.up

        self.before = obj

        return True

    def insert_before(self,obj: LinkedList2D) -> bool:
        if obj:
            if obj.before:
                obj.before.after = self

            obj.before = self

            self.up = obj.up

            self.before = obj.before

        self.after = obj

        return True

我认为通用版本看起来像这样。我使用 bound 来确保潜在实例是 LinkedList2D 的子类并实现必要的功能属性

T = TypeVar("T",bound="LinkedList2D")


class LinkedList2D(Generic[T]):
    up: Optional[T]
    down: Optional[T]
    before: Optional[T]
    after: Optional[T]

    def __init__(self) -> None:
        ...

    def iterate_children(self) -> Generator[T,None]:
        ...

    def iterate_tree(self) -> Generator[T,None]:
        ...

    def get_children(self) -> List[T]:
        ...

    def insert_under(self,op: T) -> bool:
        if op:
            if op.down:
                self.insert_before(op.down)

            op.down = self

        self.up = op

        return True

    def insert_under_last(self,op: T) -> bool:
        ...

    def insert_before(self,obj: T) -> bool:
        ...

问题是,现在 pylance 正在抱怨 insert_under 方法中的 op.down = self 行:

Cannot assign member "down" for type "LinkedList2D[T@LinkedList2D]"
  Expression of type "LinkedList2D[T@LinkedList2D]" cannot be assigned to member "down" of class "LinkedList2D[T@LinkedList2D]"
    Type "LinkedList2D[T@LinkedList2D]" cannot be assigned to type "T@LinkedList2D | None"
      Type "LinkedList2D[T@LinkedList2D]" cannot be assigned to type "T@LinkedList2D"
      Cannot assign to "None"PylancereportGeneralTypeIssues

非常感谢任何想法和提示。谢谢

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。