[英]How to construct circular referencing instances of a frozen class in 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
,最后一行显然会引发错误。 我想不出如何处理这个问题。 我读了这个线程,但该解决方案对我不起作用,因为foo.neighbor
应该指向另一个冻结的实例。
有没有办法实现这一目标? 我不受数据类的约束。 但是我在使用命名元组时遇到了同样的问题。
通过覆盖__setattr__
frozen
工作。 您可以通过直接访问实例的__dict__
属性__setattr__
完全传递__setattr__
。
foo.__dict__['neighbor'] = bar
我不知道这通常是否会产生任何意想不到的副作用(如果您使用__slots__
来防止创建__dict__
肯定不会起作用),但对于您的用例来说可能就足够了。
(如果实现更改为使用 C 扩展而不是当前动态生成源代码以传递给exec
方法,这也可能会在dataclass
未来版本中失败。我相信namedtuple
是沿着这些路线发展的。)
或者,您可以使用dataclasses
本身用于初始化冻结类的属性的相同技巧:显式使用object.__setattr__
。
object.__setattr__(foo, 'neighbor', bar)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.