Hi Kent, >
> >>> class foo(object): > ... __slots__ = ['x', 'y'] > ... > >>> f=foo() > >>> f.x=1 > >>> f.y=2 > >>> f.z=3 > Traceback (most recent call last): > File "<stdin>", line 1, in ? > AttributeError: 'foo' object has no attribute 'z' > > Take a look at > http://www.python.org/2.2.3/descrintro.html (search for __slots__) Thanks for that. I was tearing my hair out trying to figure out why despite the usage of __slots__ my instances still had a __dict__, and then I saw the subclass of object, and sure enough... I'm guessing that's how you get new style classes. Quite like what I'm seeing, __slots__ and that property() thing will allow me to remove all my __setattr__ and __getattr__ methods, which tend to make things crawl a wee bit. I was almost considering writing setters/getters to get around the magic methods, but I grew to dislike them after having used Java, I got annoyed at having to write setters/getters for every public variable. Of course, I was using Notepad to write the Java programmes, and then Eclipse helped me realise why Java programmers value IDE's so much, it's that automatic generation of set/gets... > Note to the list: Use of __slots__ is generally discouraged, but IIUC this is > exactly the >use case it was designed for so I think it is OK. Throwing an error on adding a new attribute is just what I need as the data I'm reading/writing has a very specific format; instead of using __setattr__ and checking that the attribute already existed, I can just let __slots__ do the work. Out of curiosity, if you're using __slots__ with new style, you no longer have __dict__. So, where does it stick data? I was using 'self.__dict__["_created"] = False' to set a flag at the start of __init__ to stop __setattr__ picking up the attributes being set from parsed data (and running all my type checks, etc.), but I won't need that anymore. I could almost hug property(). :) All in all, this has been an interesting tour around the inner workings of a class in Python. Give it another five years, I might be able to read one of those metaclass explanations and understand it. Regards, Liam Clarke PS Just for my edification, is there a builtin to determine how much memory is allocated to an object? _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor