我刚刚意识到:
class A(object): pass
a = A()
a.x = 'whatever'
Works(不会引发错误并创建新的x
成员)。
但是这个:
a = object()
a.x = 'whatever'
引发:
AttributeError: 'object' object has no attribute 'x'
虽然我可能永远不会在实际生产代码中使用它,但我对于不同行为的原因有点好奇。
任何提示?
答案 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