【问题标题】:Assigning to an instance's __class__ attribute in Python在 Python 中分配给实例的 __class__ 属性
【发布时间】:2011-06-17 19:29:07
【问题描述】:

在什么情况下可以,什么时候不能在Python中赋值给实例的__class__属性?

TypeError: __class__ assignment: only for heap types 之类的错误消息并没有真正为我做这件事。

【问题讨论】:

  • @Rafe:实际上,Django 在其身份验证代码中使用了这个技巧
  • 迟到了,但 matplotlib 在生产代码中也这样做了(在某些 3D 绘图中)。

标签: python metaprogramming


【解决方案1】:

您只能分配给用户定义类(即使用class 关键字定义)实例的__class__ 属性,并且新值也必须是用户定义类。类是新式还是旧式都没有关系。 (但是,您不能混合使用它们。您不能将旧式类实例转换为新式类实例。)另请参阅 Python 错误跟踪器中的this issue,它还抱怨错误消息有点很难理解。

只是添加 Rafe 在上述评论中所说的话:永远不要在生产中这样做

【讨论】:

  • 另外,从我的实验来看,__slots__ 的存在/不存在似乎也有所不同:“X 释放器不同于 Y”与 instance_with_slots.__class__ = ClassWithoutSlotsinstance_without_slots.__class__ = ClassWithSlots
  • 啊,我很困惑,因为 a.__class__ = B.__class__ 我显然应该做 a.__class__ = B
  • 请参阅mail-archive.com/python-list@python.org/msg52950.html 了解可能造成问题的类型之间的差异列表
  • matplotlibdjango 在生产中都这样做,根据上面的 cmets
  • @dtheodor 多么大胆而坦率的愚蠢声明。是的,Python 选择公开其一些相当先进且易于滥用的机制,但 这是 一个选择:__class__ 可以 已设为只读属性。说这些成熟且得到特别好的支持的项目“做错了”,因为他们做了一些我们在 stackoverflow 上建议新手不要做的事情,就像说工程师做错了,因为他们没有使用滑块,或者航天飞机焊工做错了因为他们不用烙铁。
猜你喜欢
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 2023-03-27
  • 2021-01-13
  • 2012-03-11
相关资源
最近更新 更多