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

Why can't I add arbitrary members to object instances?

本问题已经有最佳答案,请猛点这里访问。

我刚刚意识到:

1
2
3
4
class A(object): pass

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

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

但这是:

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

提升:

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

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

有什么提示吗?


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

此外,一些类(如在C中实现的datetime)也不能在运行时使用新属性进行扩展。

此类课程的解决方法是:

1
2
3
4
5
class MyObject():  # extend that class, here we extend object
  pass  # add nothing to the class

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