Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

what makes user defined objects not throw AttributeError in Python? [duplicate]

Tags:

python

oop

Possible Duplicate:
Why can't I directly add attributes to any python object?
Why can't you add attributes to object in python?

The following code does not throw AttributeError

class MyClass():
    def __init__(self):
        self.a = 'A'
        self.b = 'B'
my_obj = MyClass()
my_obj.c = 'C'

That contrasts with

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

What makes such difference? Is it about dict being a built-in class while MyClass being user defined?

like image 835
Le Curious Avatar asked Nov 03 '22 22:11

Le Curious


1 Answers

The difference is that instances of user-defined classes have a dictionary of attributes associated with them by default. You can access this dictionary using vars(my_obj) or my_obj.__dict__. You can prevent the creation of an attribute dictionary by defining __slots__:

class MyClass(object):
    __slots__ = []

Built-in types could also provide an attribute dictionary, but usually they don't. An example of a built-in type that does support attributes is the type of a function.

like image 95
Sven Marnach Avatar answered Nov 15 '22 05:11

Sven Marnach