解决python循环引用问题

以D.py作为入口,假如A.py,B.py需要相互引用,__init__.py也需要引用D.py

目录如下

一般如果不处理好引用问题都会出现下面的错误

ImportError: cannot import name 'A' from partially initialized module 'c.A' (most likely due to a circular import)

解决方法如下

__init__.py

from .A import A
from .B import B


from D import D as _D
d = _D()

A.py

import time
from .B import B


class A:
    def __init__(self, i: int):
        self.i = i

    def c(self) -> B:
        return B(self)

    def __getattribute__(self, item):
        v = super().__getattribute__(item)
        if isinstance(v, int) and time.localtime().tm_hour > 12:
            return v + 1
        return v

B.py

from typing import TYPE_CHECKING
if TYPE_CHECKING:
    from .A import A


class B:
    def __init__(self, a: "A"):
        self.a = a

    def c(self):
        from .A import A
        return A(self.a.i)

D.py 

class D:
    ...


if __name__ == '__main__':
    from c import A, B, d
    a = A(5)
    b: B = a.c()
    c = b.c()
    print(c.i, d)
  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值