On Oct 11, 4:21 pm, "[EMAIL PROTECTED]" <[EMAIL PROTECTED]> wrote: > In practice, it turns out to be a lot less work to deal with that > occasionally than to always deal with lugging around internal > attributes and external properties when they're really not needed. By > writing everything as properties up front you're just creating more > work for yourself, and it's generally considered bad practice in > Python to have default getters/setters (whether part of a property or > not).
Ok, I appreciate your and Marc's argument. So I see that a pythonic way is using public attributes, and it works in real life. Automatic "generation" of getters/setters is a nice thing when using Java style of properties, ie. no public fields. > > 2. Properties define (a part of) public interface of a class. When > > using fields for public > > access, you must tell this explicitly in documentation, or use name > > convention. > > Property vs. attribute doesn't make any difference here: both of them > are public, and part of the external interface, unless they're named > with a leading underscore. Nice thing about properites is that they are defined in more declarative way - in class body. Attributes are "defined" in a piece of code (which can be long and can contain loops etc.) by assigning a value to 'self'. > > 3. Using properties as first-class objects gives possibilities to use > > declarative approaches > > for constructing them. > > This doesn't make any sense. Properties and attributes are both > objects in python. Attribute is an object which has value specific for the time it's get from object. It is separated from containing object - relation to it is lost. Python property is an object that describes how to get/set a specific attribute of containing object - any time. It describes relationship between the two. By declarative method I mean something like a function that takes a property object and returns modified property object: def not_none(prop): def new_fset(self, obj): if obj is not None: prop.fset(self, obj) else: raise 'Cannot set None value' return property(prop.fget, new_fset, prop.fdel) And then: class Person(object): ... name = not_none( property(_get_name, _set_name) ) -- http://mail.python.org/mailman/listinfo/python-list