如何解决类型提示子类包含对其自身类型的其他实例的引用
我正在尝试为二维链表创建基类。从功能的角度来看,下面的代码已经可以正常工作了。问题是,当我将 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 举报,一经查实,本站将立刻删除。