Python 中的类定义循环引用

Posted songofhawk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 中的类定义循环引用相关的知识,希望对你有一定的参考价值。

Python中通常不做严格的类型定义,但如果是常用且固定的数据结构,还是定义清楚使用起来更方便(起码对象后面打.的时候,IDE可以自动给出方法和属性名提示)。这时,一个复杂的结构,就有可能循环引用,比如:

from typing import List


class A:
    x: str
    y: B


class B:
    w: List[A]

这样的代码,连编译都过不去,会在‘y: B’,这个位置,直接提示:‘Unresolved reference B’。解决方案有两个:

  1. 保持在同一个文件中定义类
    此时可以添加一个特殊的引用:from __future__ import annotations,告知编译器先“通读”整个文件,再处理typing annotation,就可以避免上述问题。
  2. 拆分到不同模块中
    这种情况下,就得在引用另外一个类的时候,直接引用它的模块,而不是类名:
Module1.py
from . import Module2


class A:
    x: str
    y: Module2.B
Module2.py
from typing import List

from . import Module1


class B:
    w: List[Module1.A]

以上是关于Python 中的类定义循环引用的主要内容,如果未能解决你的问题,请参考以下文章

常用python日期日志获取内容循环的代码片段

Python中的循环依赖

如何将数组中的类随机分配给for循环中创建的元素

python中循环引用导致内存泄漏小案例

Java 中的循环引用

使用C语言为python编写动态模块--在C中实现python中的类