How do you implement this Python idiom in C++

alainpoint at yahoo.fr alainpoint at yahoo.fr
Mon Jul 31 01:56:05 EDT 2006


Pierre Barbier de Reuille wrote:
> alainpoint at yahoo.fr 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




More information about the Python-list mailing list