dictproxy的目的是什么?

2024-04-26 21:11:40 发布

您现在位置:Python中文网/ 问答频道 /正文

类型的__dict__是一个只读的dictproxy对象。我想知道它的目的是什么。是否仅用于“不允许修改内置类型”?我找到了一个可以绕过这个的方法。我知道修改内置类型不是个好主意。但我正在尝试修改飞行中的Cython的cdef class

我想知道这样修改cdef class__dict__有什么危险吗?

代码如下:

import gc
gc.get_referents(float.__dict__)[0]["square"] = lambda self: self*self
(3.14).square()

Tags: 对象方法代码self目的类型内置gc
2条回答

dictproxy(在类中找到)的目的是允许在Python解释器中进行优化并确保其稳定性。请参阅下面的MartijnPieters注释,了解优化需求的详细信息,这些优化显然依赖于始终为字符串的class.__dict__键。

dictproxy在防止解释器中的某些不稳定性方面似乎也起到了作用。有关这种不稳定性的更多信息,请参阅python.org上讨论的标题为Bypassing __dict__ readonlyness的错误报告和错误修复。如果不使用某种代理机制,那么__dict__可以写入。如果可以写,可以删除。在bug报告中,他们讨论了__dict__可能被删除并导致解释器崩溃的一些场景。

请注意,这与类实例形成对比,类实例可以直接或通过__setitem__()分配给它们:

  • instance.__dict__['x'] = 1

此外,可以删除实例__dict__。如果它被删除,则在尝试分配属性时会自动重新创建它:

del instance.__dict__ instance.a = 1 instance.__dict__

结论

总之,dictproxy允许类更优化地操作,并使解释器更稳定。

__dict__是包含类属性的命名空间对象。

只要不修改__dict__本身,修改dict对象就不会有问题:

示例:

//good
MyClass.x = 1 

//bad
MyClass.__dict__['x'] = 1

//good
m = MyClass()
m.x = 1

//also good
m.__dict__['x'] = 1

Python文档[LINK]: Attribute assignment updates the module’s namespace dictionary, e.g., m.x = 1 is equivalent to m.__dict__["x"] = 1.

因此修改dict的对象应该没有问题。

此外:

由于我们可以修改类的属性,因此类的dict始终是可写的:

__dict__ | The namespace supporting arbitrary function attributes. | Writable

注意

可能Cpython的实现与pyhton稍有不同,但我从文档中可以看到,它没有提到。

相关问题 更多 >