【问题标题】:python: dynamically adding attributes to a built-in classpython:为内置类动态添加属性
【发布时间】:2012-01-12 22:16:25
【问题描述】:

为什么它不适用于内置类?

使用子类是修复它的最佳方法,还是会遇到一些隐藏的问题?

a = {}
a.p = 1 # raises AttributeError
class B(dict):
  pass
b = B()
b.p = 1 # works

编辑:我最初认为它不适用于 b 的评论不正确(我犯了一个错误)。

【问题讨论】:

  • 懒懒回答:__slots__; dict 也是用 C 实现的,你正在继承它。
  • 你用的是什么python版本? b.p = 1 适用于 2.7.2 和 3.2
  • 非常抱歉,它确实适用于 b。更新了问题以反映这一点。
  • 你可以自己修改内置类——你必须创建它们的子类。
  • @BasicWolf:为什么这么说?

标签: python attributes python-3.x subclass


【解决方案1】:

内置类不能具有任意属性。这样做是出于性能的原因,尤其是内存使用,您希望像 listdict 这样的内置类尽可能小,以便您可以拥有很多。

因此,内置类没有任意属性工作所需的 __dict__ 字典。

您可以为您的课程实现相同的目标。如果它们是用 C 语言编写的,那么您根本不需要实现 __dict__ 支持。如果它们是用 Python 编写的,则使用 slots

【讨论】:

    【解决方案2】:

    如果你想继承dict,你总是可以使用UserDict (here the documentation)。

    它适用于您正在尝试做的事情:

    from collections import UserDict
    
    a = UserDict()
    a.p = 10 # works fine
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 2017-01-13
      • 2019-04-28
      • 1970-01-01
      相关资源
      最近更新 更多