On Sat, 10 Nov 2007 17:00:13 +0200, Donn Ingle wrote:

>> The first creates an attribute of the class, the second creates an
>> attribute in the instance.
> 
> Given that, can you clarify this:
> 
> class Test:
>     attribute = "original value"
>     
> class Bob:
>     def __init__(self):
>         self.ref = Test()
>         
> class Jim:
>     def __init__(self):
>         self.ref = Test()
>         
> b = Bob()
> j = Jim()
> 
> print b.ref.attribute #prints "original value"
> 
> b.ref.attribute = "haschanged"
> ## Where is the value "haschanged" going here?

To *instance* of `Test` you created and bound to `b.ref`.

> print b.ref.attribute # print "haschanged"
> 
> print j.ref.attribute #prints "original value"
> ## If it changed and an attribute of the Class, then
> ## why is it back to "original value" ?

Because the *instance* of `Test` bound to `j.ref` does not have
`attribute` it is looked up in the *class* `Test`.

>> Actually the lookup is somewhat more complex than that when you use new-
>> style classes (and you should always use new-style classes): properties
>> (or other objects with a 'get' method) are class attributes but take
>> precedence over instance attributes.
> What is a 'get' method? Do you mean it should get all Java-esque with
> getBlah and setBlah for every little thing?

Good $GOD no!  He's talking about the `__get__` method on properties. Read
the docs for the built in `property()` function.  It's a nice mechanism to
actually avoid all those getters and setters because you can turn "simple"
attributes into "computed" attributes without changing the API of the
objects.

Ciao,
        Marc 'BlackJack' Rintsch
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to