为什么我不能将任意成员添加到对象实例?

时间:2013-12-17 15:58:15

标签: python

我刚刚意识到:

class A(object): pass

a = A()
a.x = 'whatever'

Works(不会引发错误并创建新的x成员)。

但是这个:

a = object()
a.x = 'whatever'

引发:

AttributeError: 'object' object has no attribute 'x'

虽然我可能永远不会在实际生产代码中使用它,但我对于不同行为的原因有点好奇。

任何提示?

1 个答案:

答案 0 :(得分:3)

可能是因为__slots__。默认情况下,您的类具有所有属性的dict,可以添加到第一个示例中。但是这种行为可以通过使用插槽来覆盖。

此外,在C语言中实现的某些类(如datetime)也无法在运行时使用新属性进行扩展。

此类的解决方法是执行以下操作:

class MyObject():  # extend that class, here we extend object
  pass  # add nothing to the class

o = MyObject()
o.x = 'whatever'  # works