如何解决如何在python中构造冻结类的循环引用实例
from dataclasses import dataclass
@dataclass()
class Foo:
id: int
neighbor: 'Foo'
foo = Foo(1,None)
bar = Foo(2,foo)
foo.neighbor = bar
我真的想要一个冻结的类,因为在多线程运行中不能操作这些对象。但是如果我声明 frozen=True
,最后一行显然会引发错误。我想不出如何处理这个问题。我阅读了 this thread,但该解决方案对我不起作用,因为 foo.neighbor
应该指向另一个冻结的实例。
有什么办法可以做到这一点吗?我不受数据类的约束。但是我在使用命名元组时遇到了同样的问题。
解决方法
frozen
通过覆盖 __setattr__
起作用。您可以通过直接访问实例的 __setattr__
属性来完全传递 __dict__
。
foo.__dict__['neighbor'] = bar
我不知道这在一般情况下是否会产生任何意想不到的副作用(如果您使用 __slots__
来阻止 __dict__
被创建,当然不会起作用),但它可能就足够了适合您的用例。
(如果实现更改为使用 C 扩展而不是当前动态生成源代码以传递给 dataclass
的方法,这也可能会在 exec
的未来版本中失败。{{1} } 我相信是沿着这些路线发展的。)
或者,您可以使用 namedtuple
本身用于初始化冻结类的属性的相同技巧:显式使用 dataclasses
。
object.__setattr__
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。