Classes - instance/class, methods/members, inheritance and be st practices

Evan Jones EvanJ at eyron.com
Thu May 3 14:05:50 CEST 2001


Thanks Alex and Rainer,  that's helped a lot.  
Cheers,
Evan

> -----Original Message-----
> From:	Alex Martelli [SMTP:aleaxit at yahoo.com]
> Sent:	Wed, May 02, 2001 5:30 PM
> To:	python-list at python.org
> Subject:	Re: Classes - instance/class, methods/members, inheritance
> and best practices
> 
> "Evan Jones" <EvanJ at eyron.com> wrote in message
> news:mailman.988812244.30750.python-list at python.org...
> > Hiya,
> >
> > I have just started learning Python and was just hoping someone could
> help
> > set things straight in my head on user defined classes.
> >
> > So far as I understand from the docs an instance variable should be
> > initialized by the __init__ method;
> 
> Good practice, yes.
> 
> > an instance method is simply defined in
> > the class definition; class variables are added to the class definition
> but
> > there are no class methods.
> 
> Essentially right.
> 
> > In addition I understand that there is no
> > 'constructor' chaining, so that if you are inheriting from some base
> > classes, when you instantiate the super class the __init__ methods don't
> get
> > called from the sub classes.
> 
> Not _automatically_ -- you have to do the calling yourself.
> 
> > So what I have been doing is to create each class in a file of its own
> and
> > add function definitions to that file to act as 'class' methods, and
> 
> Quite acceptable, I think.  There are of course alternatives, e.g.
> http://www.activestate.com/ASPN/Python/Cookbook/Recipe/52304.
> 
> > constructor chaining I have been doing by hand like:
> >
> > class Base:
> > __init__(self):
> > self.init_Base()
> >
> > init_Base(self):
> > #etc ...
> 
> This seems slightly too complicated: you could just do your
> initialization in __init__ here.  (You're also missing the
> 'def's, but I guess that's a minor oversight).
> 
> 
> > class Super(Base):
> > __init__(self):
> > self.init_Super()
> >
> > init_Super(self):
> > self.init_Base()
> > #etc ...
> 
> Again, Super's __init__ could just do the initialization
> itself, and start with a call to Base's own init.  I.e.:
> 
> class Super(Base):
>     def __init__(self):
>         Base.__init__(self)
>         # rest of Super's initialization
> 
> 
> I suspect the one thing you're missing here is that you
> CAN call a method on a class object, as long as you pass
> an instance object (of that class or any subclass thereof)
> as its first argument.
> 
> 
> > So if any one could correct me if I'm wrong, or let me know what the
> > accepted best practices for 'class methods' and 'constructor chaining'
> are,
> > I'd be very grateful.
> 
> I think your arrangement, modified to use direct calls to
> Base.__init__ &c and do the initialization in __init__, is
> likely to be best, because it's simplest.  Again there are
> alternatives, see e.g.
> http://www.activestate.com/ASPN/Python/Cookbook/Recipe/52236
> 
> 
> Alex
> 
> 
> 
> -- 
> http://mail.python.org/mailman/listinfo/python-list




More information about the Python-list mailing list