On Thursday 29 September 2005 09:08, Michael Schneider wrote: > Design Intent: > > 1) mark an object as dirty in a setter (anytime the object is > changed, the dirty flag is set without requiring a user to set the > dirty flag
2 ways: wrap every attribute that is to be set in a property object (in new-style classes), and set it in the setter there. Or override __setattr__ to set the dirty flag. Or, if you want overkill, but a potentially cleaner interface in some cases, a metaclass could also be contrived to accomplish this (crud, you can do _anything_ with a metaclass). > 2) enforce value constraints (even if just during debugging) Python's property objects def _get_foo(self, foo): return self.__foo def _set_foo(self, foo, val): if self.__is_valid_foo(val): self.__foo = foo else: raise ValueError("Invalid foo") foo = property(_get_foo, _set_foo, doc="Foo property") > 3) lazy init, don't bring the data in until needed Define __getattr__. Or use a metaclass (but I tend to think of metaclasses as a solution to too many things - see previous thread about synchronization for details). > 4) adding debug info A metaclass to do tracing, whatever - they let you modify the nature of your class greatly on the fly. > 5) .... more here???? Overriding magic methods (esp. getattr/setattr), various decorators (ether existing or custom for your purposes), metaclasses, etc. > I usually violate private when adding an aspect to a class, and > I don't want this code in every class. Example, persistence. Persistence can be done with subclassing, with a base class that sets up persistence (I did this in PHP4 once, an ugly object model if I've ever seen one). Metaclasses might be cleaner. > I really like the C# properties, you can access data with a data > accessor, but add functionality is triggered when accessing the data. Python has these - use property objects. property() is documented under Built-In Functions > I like the data access syntax, better then the set/get functions. I > need the functionality to achieve the design goals above, so i use > function, but the are ugly, especially in math code. Yes, get/set is highly ugly IMHO. I have to do Java for one of my classes now... I frequently want to gag over the forced usage of such things. > It would be easy for me to say "Add public and private to python so I > can code the way that I am used to". What are some python > alternatives to achieve the design intents specified above above? See above :-). I think you'll find that you can accomplish most or all of your purposes, and then a few you may not have thought of yet. - Michael -- http://mail.python.org/mailman/listinfo/python-list