Classes - instance/class, methods/members, inheritance and best practices
Alex Martelli
aleaxit at yahoo.com
Wed May 2 11:29:47 EDT 2001
"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
More information about the Python-list
mailing list