vars between classes

Carel Fellinger cfelling at iae.nl
Tue May 30 23:18:38 CEST 2000


Marc Tardif <intmktg at Gloria.CAM.ORG> wrote:
> How can I maintain variables between classes and superclasses without
> passing explicitly as methods arguments? For instance:

I think you were confused by the diabolic behavior of "self.some_class_var".
Please refrain from using that construct whenever you deal with true class
variables. The "self." construct starts looking in the instance name space,
then looks in the class name space and then in all it's parent's classes
name spaces. So you can access a class var as if it were an instance var,
but only in expressions, *not* at the left-hand site of an assignment!
And only *prior* to an assignment to an instance var with that name!!!

The following annotated code will not only bewilder you, but alse give
you the behaviour you were after (if I guessed right:)

--------------------------------------------------------------------------
#! /usr/bin/python

import string

class A:
   mine = 'A'     # a class var

   def __init__(self):
      print "A's init, no instance var yet:", A.mine, self.mine,
      # now we create an instance variable shadowing the class var
      self.mine = string.lower(self.mine)
      print ", now with instance var:", A.mine, self.mine

   def mines(self):
      # return the class and instance variable mine
      return "printing A's: %2s %4s" % (A.mine, self.mine)

   def drink(self):
      # drinking gives us double vision, not our whole class
      self.mine = self.mine * 2


class B(A):

   def __init__(self):
      print "B initially without class var:", A.mine, self.mine,
      # now we create a clas variable shadowing the inherited one
      B.mine = 'B'
      print ', now with class var:', B.mine
      A.__init__(self)

   def mines(self):
      return A.mines(self) +\
             (", and B's: %4s %4s" % (B.mine, self.mine))

   def drink(self):
      # we drink like our parents,
      A.drink(self)
      # but we never drink alone, so the whole class gets drunk
      B.mine = B.mine * 2

   def booze(self):
      self.drink()
      # and if we really really drink our parents get drunk too
      A.mine = A.mine * 2


def print_abc(mess):
   print 'After', mess
   print 'a', a.mines()
   print 'b', b.mines()
   print 'c', c.mines()

a, b, c = A(), B(), B()
print_abc('instantiation')

b.drink()
print_abc('b.drink')

b.booze()
print_abc('b.booze')



-- 
groetjes, carel



More information about the Python-list mailing list