如何解析同一模块中两个Python类的循环导入?

2024-10-03 04:29:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个紧密耦合的Python类,它们需要相互引用(在类级别,而不是实例级别)。如何解析循环导入?理想情况下,我希望能够使它工作在同一个模块或两个不同的模块之间,但我会满足于一个或另一个。你知道吗

# yin_yang.py

class MyYin(Yin):
    __yang__ = MyYang

class MyYang(Yang):
    __yin__ = MyYin

Tags: 模块实例py情况级别classyang理想
3条回答

尽管@phillip martin的回答是最具恶作剧意味的,但还有一种方法可以完成这项任务:

from werkzeug import LocalProxy


class MyYin:
    __yang__ = LocalProxy(lambda: MyYang)
    foo = 42


class MyYang:
    __yin__ = LocalProxy(lambda: MyYin)
    bar = 9002


print(MyYin.__yang__.bar)
print(MyYang.__yin__.foo)

LocalProxy技巧背后的魔力来自于覆盖所有__getattr____setattr____etc__方法。在werkzeug回购中查看。你知道吗

当Python解释器找到一个类声明时,它会创建一个新的作用域,并在这个代码块中执行类内部的代码,也就是说,当执行类声明时,所有类变量都会被实例化。你知道吗

您可以通过一种非常简单的方式避免这种情况:

class MyYin(Yin):
    pass


class MyYang(Yang):
    __yin__ = MyYin

MyYin.__yang__ = MyYang

或者

class MyYang(Yang):
    pass


class MyYin(Yin):
    __yang__ = MyYang


MyYang.__yin__ = MyYin

可以在声明一个或两个类之后设置它们的类属性。你知道吗

class MyYin(Yin):
    pass

class MyYang(Yang):
    __yin__ = MyYin

MyYin.__yang__ = MyYang

相关问题 更多 >