[EMAIL PROTECTED] escribió: > I've been reading about Python Classes, and I'm a little confused about > how Python stores the state of an object. I was hoping for some help. > > I realize that you can't create an empty place holder for a member > variable of a Python object. It has to be given a value when defined, > or set within a method.
I don't understand what do you mean with "empty place holder". Some pre-allocated-and-uninitialized memory to hold the attribute value (ala C++ o java)? Maybe slots? >>> class Foo(object) : ... __slots__ = ['foo'] ... >>> f=Foo() >>> dir(f) ['__class__', '__delattr__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__slots__', '__str__', 'foo'] >>> f.foo Traceback (most recent call last): File "<stdin>", line 1, in ? AttributeError: foo >>> f.foo = 3 >>> dir(f) ['__class__', '__delattr__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__slots__', '__str__', 'foo'] >>> f.foo 3 > But what is the difference between an Attribute of a Class, a > Descriptor in a Class, and a Property in a Class? I don't know what the formal definitions are. Probably "attribute" refers to anything that can be obtained by way of getattr(). According to this "definition" an attribute does not require to be stored in the instance, it can be calculated or obtained from somewhere else. >>> class SimpleExample : ... def __getattr__(self, name) : ... if name=='attr' : ... return 0 ... raise AttributeError(name) ... >>> s = SimpleExample() >>> s.attr 0 >>> s.bar Traceback (most recent call last): File "<stdin>", line 1, in ? File "<stdin>", line 5, in __getattr__ AttributeError: bar descriptors are a mechanism/protocol for attribute access. It's intended to solve some problems of the original __getattr__() protocol. A property is a specialized type of descriptor which allows customization of attribute's access methods. > If I had a Monster Class, and I wanted to give each Monster a member > variable called ScaryFactor, how would I define it? If you're asking when to use plain attributes, descriptors or properties the answer is that it depends on what you want/need: * if you store monsters in a database and the ScaryFactor attribute is computed by some complex and expensive database lookup I'll go for some kind of lazy descriptor/property * if you want to be able to control/limit what can be done with an attribute may be a property is enough. This includes things like make the attribute read only etc. * if you don't have special requirements a plain attribute would be probably simpler and faster > Does a Property > simply provide methods that access an Attribute? not exactly, it allows you to assign/define the methods that will be used to access the attribute, but you still access to the attribute in the usual "dot-way". For further info take a look at: http://www.python.org/doc/newstyle/ HTH -- http://mail.python.org/mailman/listinfo/python-list