2024-10-03 04:29:01 发布
网友
我有两个紧密耦合的Python类,它们需要相互引用(在类级别,而不是实例级别)。如何解析循环导入?理想情况下,我希望能够使它工作在同一个模块或两个不同的模块之间,但我会满足于一个或另一个。你知道吗
# yin_yang.py class MyYin(Yin): __yang__ = MyYang class MyYang(Yang): __yin__ = MyYin
尽管@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回购中查看。你知道吗
LocalProxy
__getattr__
__setattr__
__etc__
当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
可以在声明一个或两个类之后设置它们的类属性。你知道吗
尽管@phillip martin的回答是最具恶作剧意味的,但还有一种方法可以完成这项任务:
而
LocalProxy
技巧背后的魔力来自于覆盖所有__getattr__
、__setattr__
、__etc__
方法。在werkzeug回购中查看。你知道吗当Python解释器找到一个类声明时,它会创建一个新的作用域,并在这个代码块中执行类内部的代码,也就是说,当执行类声明时,所有类变量都会被实例化。你知道吗
您可以通过一种非常简单的方式避免这种情况:
或者
可以在声明一个或两个类之后设置它们的类属性。你知道吗
相关问题 更多 >
编程相关推荐