在Python中分配实例的__class__属性

por*_*uod 21 python metaprogramming

在什么情况下可能,什么时候不可能,__class__在Python中分配实例的属性?

错误消息,例如TypeError: __class__ assignment: only for heap types不要真的为我做.

Sve*_*ach 15

您只能分配__class__用户定义类的实例的属性(即使用class关键字定义),新值也必须是用户定义的类.无论是新式还是旧式都无关紧要.(但是你不能混用它们.你不能把旧式的类实例变成新式的类实例.)参见Python bug跟踪器中的这个问题,它也抱怨错误信息有些困难了解.

只是为了补充Rafe在上面评论中所说的内容:永远不要在生产中这样做.

  • 另外,从我的实验来看,似乎`__slots__`的存在与否也有所不同:"X deallocator与Y"不同于`instance_with_slots .__ class__ = ClassWithoutSlots`和`instance_without_slots .__ class__ = ClassWithSlots` (3认同)
  • 根据上述评论,"matplotlib"和"django"都在生产中这样做 (3认同)
  • @dtheodor 这是多么大胆和坦白的愚蠢声明。是的,Python 选择公开一些相当先进且易于误用的机制,但 *这是*一个选择:`__class__` *可以*被设为只读属性。说这些成熟且得到特别良好支持的项目“做错了”,因为它们做了我们在 stackoverflow 上建议新手不要做的事情,就像说工程师做错了,因为他们没有使用滑尺,或者航天飞机焊工做错了因为他们不使用烙铁。 (2认同)
  • @jedwards 并不是语言设计者允许做的所有事情实际上都是一个好主意,即使流行的项目这样做了。我没有时间写详细的分析,但是在查看代码之后,我确信 Django 和 Matplotlib 最好不要使用这个 hack。魔法太多,几乎没有任何收获。 (2认同)