Reputation: 52343
Why doesn't it work for the built-in classes?
Is using a subclass the best approach to fix it, or will I run into some hidden problems?
a = {}
a.p = 1 # raises AttributeError
class B(dict):
pass
b = B()
b.p = 1 # works
EDIT: my original comment that it doesn't work for b
was incorrect (I made a mistake).
Upvotes: 0
Views: 507
Reputation: 172367
The builtin classes do not have the ability to have arbitrary attributes. This is done for reasons of performance, especially memory usage, you want the built-in classes like list
and dict
to be as small as possible so you can have many of them.
Therefore the built-in classes do not have the __dict__
dictionary that is needed for arbitrary attributes to work.
You can achieve the same for your classes. If they are written in C you simply do not implement the __dict__
support. If they are written in Python you use slots.
Upvotes: 4
Reputation: 29312
If you want to subclass dict
you can always use UserDict
(here the documentation).
And it works with what you're trying to do:
from collections import UserDict
a = UserDict()
a.p = 10 # works fine
Upvotes: 0