__dict__ is neato torpedo!
Hans Mulder
hansmu at xs4all.nl
Sun Jun 12 11:20:42 EDT 2011
On 12/06/11 10:47:01, Steven D'Aprano wrote:
> On Sat, 11 Jun 2011 21:28:40 -0500, Andrew Berg wrote:
>
>> On 2011.06.11 09:13 PM, Steven D'Aprano wrote:
>
>>> A second, more subtle risk: not all objects have a __dict__. But if you
>>> obey the rule about never updating from arbitrary objects you don't
>>> know, then you won't be surprised by an object with no __dict__.
>>
>> What objects don't (other than the obvious ones like strings,
>> dictionaries, ints and lists)?
>
> namedtuple is another common example.
>
> In pure Python, objects created using __slots__ usually don't have a
> __dict__. Quite possibly C extension objects. There may be others.
The base class 'object' is a well-known example:
>>> ham = object()
>>> ham.spam = 'eggs'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'spam'
>>>
But subclasses of object do have a __dict__ by default,
which is why you'd normally do:
>>> class Ham(object):
... pass
...
>>> ham = Ham()
>>> ham.spam = 'eggs'
>>>
Here, the only reason for creating a subclass with no visible new
methods or attributes, is the unmentioned __dict__ attribute that
Ham instances have and 'object' instances lack.
-- HansM
More information about the Python-list
mailing list