Automatic class attribute

Kirk McDonald mooquack at suad.org
Fri Feb 3 17:49:27 EST 2006


Franck PEREZ wrote:
> Hello all,
> 
> Considering the following code :
> 
> class C(object):
>    ...:     observers = []
>    ...:
>    ...:     @classmethod
>    ...:     def showObservers(cls):
>    ...:         print cls.observers
> 
> class D1(C):
>    ...:     observers = [] #could it be moved in C ?
> 
> class D2(C):
>    ...:     observers = [] #could it be moved in C ?
> 
> I want each child class of C to have it's own "observers" class attribute.
> 
> The code I provided works... but I'd like to avoid typing "observers =
> []" in each child class.
> 
> Is it possible to define something in C which would basically mean :
> "for each child class, automatically bind a new list attribute called
> observers" ?
> 
> Are metaclasses a way ? Is it possible to avoid them ?
> Thanks a lot,
> Franck

By an astounding coincidence, I was just working on a similar problem. 
Metaclasses can do this, no problem:

class M(type):
     def __init__(cls, name, bases, dict):
         cls.observers = []

     def showObservers(cls):
         print cls.observers

class C(object):
     __metaclass__ = M

class D1(C): pass
class D2(C): pass

-Kirk McDonald



More information about the Python-list mailing list