是什么让用户定义的对象不在Python中抛出AttributeError?

Le *_*ous 5 python oop

可能重复:
为什么我不能直接向任何python对象添加属性?
为什么不能在python中向对象添加属性?

以下代码不会抛出AttributeError

class MyClass():
    def __init__(self):
        self.a = 'A'
        self.b = 'B'
my_obj = MyClass()
my_obj.c = 'C'
Run Code Online (Sandbox Code Playgroud)

这与之形成鲜明对比

>>> {}.a = 'A'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'dict' object has no attribute 'a'
Run Code Online (Sandbox Code Playgroud)

有什么区别?它是关于dict是一个内置类,而MyClass是用户定义的吗?

Sve*_*ach 2

不同之处在于,用户定义类的实例默认具有与其关联的属性字典。您可以使用vars(my_obj)或访问该词典my_obj.__dict__。您可以通过定义来阻止创建属性字典__slots__

class MyClass(object):
    __slots__ = []
Run Code Online (Sandbox Code Playgroud)

内置类型还可以提供属性字典,但通常不会。支持属性的内置类型的一个示例是函数类型。