After an object has been created, I can add and remove slots at will, as I can do with a dictionary. Even methods are just objects stored in slots,
Be careful saying slots -- __slots__
has a specific meaning in Python.
so I probably can add methods to a dictionary as well.
foo = {}
foo.bar = 1
AttributeError: 'dict' object has no attribute 'bar'
Not by default, you'd need to subclass it -- but then you're using a class. Instead, put the function in the dictionary:
def bar():
return 1
foo['bar'] = bar
foo['baz'] = lambda: 1
Is there something I can do with an object that I could never do with a dictionary?
This question actually has a false premise -- dictionaries are objects, so anything you do with a dictionary you are doing with an object. For the rest of this answer, I'll pretend you mean "user defined class" when you say "object".
No, there is nothing you can do with a user-defined class you can't do with a dictionary. Classes are even implemented with a dictionary.
class Foo(object):
pass
print Foo.__dict__
# {'__dict__': <attribute '__dict__' of 'Foo' objects>, '__module__': '__main__',
# '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': None}
Anything you can do with a class in Python you can do without one, with more work (and code which is much harder to understand, use, and maintain). It's even been said that Python classes are just syntactic sugar for dictionaries.
A very similar question was asked recently as Do I need to learn about objects, or can I save time and just learn dictionaries? I think my answer to that is also relevant here.
__getattr__
, but then you're just doing exactly what a class is doing), but it can do anything a class can do, since a class is just a dictionary internally. It's just easier to use. The reference at the end of my answer explains the why of objects and classes in Python. – Dialect