Pierre Barbier de Reuille wrote:
> [EMAIL PROTECTED] wrote:
> > Pierre Barbier de Reuille wrote:
> [...]
> >
> > I thank you for your response. The equivalent of your solution is
> > posted hereunder:
> > class cA(object):
> >         count=0
> >         def __init__(self):
> >                 self.__class__.count +=1
> >         @classmethod
> >         def getcount(cls):
> >                 return cls.count
> >     def __del__(self):
> >             self.__class__.count -=1
> > class cB(cA):
> >         count=0
> >         def __init__(self):
> >             super(cB,self).__init__()
> >             for klass in self.__class__.__bases__:
> >                     klass.count +=1
> >
> > a=cA() ; b=cA(); c= cA()
> > d=cB() ; e=cB(); f= cB()
> > a.a=1;b.a=1;c.a=1;d.a=1;e.a=1;f.a=1
> > g=cA()
> > g.a=1
> > print  '#cA=',cA.getcount()  # 7
> > print '#cB=',cB.getcount() #  3
> > del g
> > print  '#cA=',cA.getcount()  # 6
> > print '#cB=',cB.getcount() #  3
> >
> > There is nothing impossible in Python ;-)
> >
> > Alain
> >
>
> Well, nothing is impossible, but it is now much much more complex ! As a
> proof of that, your version does not work completely :P (try deleting d
> for example).
>
> I add a working version, but you will also notice that I have to
> *explicitly* walk over all the classes of the hierarchy, testing for the
> one who have a "count" attribute, hoping that this attribute is indeed
> for counting the number of objects and not anything else ... so the
> solution is quite fragile and very slow.
>
> class cA(object):
>         count=0
>         def __init__(self):
>                 self.__class__.count +=1
>                 for klass in self.__class__.__bases__:
>                         if hasattr( klass, "count" ):
>                                 klass.count += 1
>
>         @classmethod
>         def getcount(cls):
>                 return cls.count
>         def __del__(self):
>                 self.__class__.count -=1
>                 for klass in self.__class__.__bases__:
>                         if hasattr( klass, "count" ):
>                                 klass.count -= 1
> class cB(cA):
>         count=0
>
> a=cA() ; b=cA(); c= cA()
> d=cB() ; e=cB(); f= cB()
> a.a=1;b.a=1;c.a=1;d.a=1;e.a=1;f.a=1
> g=cA()
> g.a=1
> print  '#cA=',cA.getcount()  # 7
> print '#cB=',cB.getcount() #  3
> del g
> del d
> print  '#cA=',cA.getcount()  # 5
> print '#cB=',cB.getcount() #  2
>
> Pierre

Good point Pierre. But you'll have to admit that the class usage in
Python is much simpler (just derive from the class)
class cB(cA):
      count=0
contrarily to the C++ usage where you must remind the compiler of the
Counted class in every derived class.

In  Python, you have to bite only once thru the sour apple .... 


Alain

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to