Static Data?

Stevie_mac no.email at please.com
Sun Apr 11 07:15:11 EDT 2004


Thanks Peter, I really appreciate this - I'm gonna trim this down to a short tutorial - I personally think (even having
read up on classes & scope) that this was the toughest thing to get my head around.

"Peter Otten" <__peter__ at web.de> wrote in message news:c5ausj$qfb$01$1 at news.t-online.com...
> Stevie_mac wrote:
>
> > In Jeffs solution, Is self._ID the same variable as _ID (declared
> > immediately after class Counted). Is there 3 _IDs? If you have the time,
>
> Jeff Epler's code with annotations:
>
> class Counted:
>     _ID = 0 # set the class attribute; same as Counted._ID = 0
>
>     def __init__(self):
>         Counted._ID += 1 # increment the class attribute
>         self._ID = Counted._ID # set the instance attribute to the
>                                # current value of the class attribute
>
> > could you explain (nothing fancy, just brief) the meaning of declaring
> > variables in different
> > locations (like self, below class, as part of class, in a class def).
> > This would be greatly appreciated.
> >
> > and Peters solution
> > class Object:
> >     _ID = 1
> >     def __init__(self):
> >         self.ID = Object._ID
> >         Object._ID += 1
> > Is Object._ID a class instance variable and self.ID a 'shared' class
> > variable
>
> This is basically the same as Jeff's. I just chose different names for the
> class attribute (_ID) and instance attribute (ID).
>
> If you set an attribute in the class,
>
> class Object:
>     clsattr = 1
>
> that is the same as
>
> class Object:
>     pass
> Object.clsattr = 1
>
> If you set an instance attribute you always need the instance:
>
> inst = Object()
> inst.attr = 2
>
> Inside a method it's the same, only the instance will most likely be named
> self.
>
> class Object:
>     def method(self, newvalue):
>         self.attr = newvalue
>
> Now for attribute lookup:
>
> inst.attr
>
> will first look up attr in the instance, and if it's not there, it will fall
> back to the class:
>
> >>> class Object:
> ...     pass
> ...
> >>> Object.attr = "in class"
> >>> inst = Object()
> >>> inst.attr
> 'in class'
> >>> inst.attr = "in instance"
> >>> inst.attr
> 'in instance'
>
> The class attribute is still there, only "shaded" bye the instance
> attribute:
>
> >>> Object.attr
> 'in class'
>
> Now let's delete the instance attribute:
>
> >>> del inst.attr
> >>> inst.attr
> 'in class'
>
> The class attribute becomes visible again.
>
> Once you have understood the above, classmethods are just a another way to
> access the class instead of the instance. The advantage over an explicit
> use of the class identifier is that with inheritance they always provide
> the actual class:
>
> >>> class Object(object):
> ...     def method(cls):
> ...             print cls.__name__
> ...     method = classmethod(method)
> ...
> >>> class Sub(Object):
> ...     pass
> ...
> >>> Object().method()
> Object
> >>> Sub().method()
> Sub
>
> Peter
>





More information about the Python-list mailing list