繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM