On Apr 11, 10:15 am, Bruno Desthuilliers <bruno.
[EMAIL PROTECTED]> wrote:
> goodwolf a écrit :
>
>
>
> > On Apr 11, 9:09 am, Bruno Desthuilliers <bruno.
> > [EMAIL PROTECTED]> wrote:
> >> goodwolf a écrit :
> >> (snip)
>
> >>> 1. In this case you will prefer a classmethod instead a staticmethod.
> >>> 2. If counter is the number of instances of class AAA then you will
> >>> incrase counter inside __init__ method.
> >>> class AAA (object):
> >>> counter = 0
> >>> def __init__(self):
> >>> type(self).counter_increase()
> >> You can call a class method on an instance:
> >> self.counter_increase()
>
> >> And FWIW, this is probably something I'd put in the constructor (the
> >> __new__ method), not in the initializer.
>
> >>> @classmethod
> >>> def counter_increase(cls):
> >>> cls.counter += 1
> >>> or
> >>> class AAA (object):
> >>> counter = 0
> >>> def __init__(self):
> >>> type(self).counter += 1
> >> Instances have a reference to their class, so you can also write this:
> >> self.__class__.counter += 1
>
> > OK, you will use something like this:
>
> > class AAA (object):
> > counter = 0
> > def __new__(cls):
> > cls.counter += 1
> > return super(cls, cls).__new__(cls)
>
> return super(AAA, cls).__new__(cls)
>
> > but I think that __new__ is more "low level" and not necessary here,
>
> It's of course 'not necessary'. But (IMHO):
> - increasing the class's instance counter is more a responsability of
> the class than a responsability of the instance - and it has nothing to
> do with initializing the instance's state
> - if someone is to subclass AAA, there are fewer chances that he'll
> override the constructer than the initializer, and if he does, there are
> more chances that he won't forget to call on the parent's constructor.
>
> IOW, this is actually *because* it is 'lower level' that I think it's a
> better place for such operations.
>
> But YMMV, of course !-)
>
> My 2 cents...
OK, but then you will use an more flexible constructor:
class AAA (object):
counter = 0
def __new__(cls, *args, **kwargs):
cls.counter += 1
return super(AAA, cls).__new__(cls, *args, **kwargs)
then you see that you will pay lot resources for a "lower level"
operation.
However if your counter is to consider a low level think, than You are
right, but it's more a personal consideration.
--
http://mail.python.org/mailman/listinfo/python-list