微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在python中构造冻结类的循环引用实例

如何解决如何在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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?