Vaikka olen ohjelmoinut Pythonilla jo jonkin aikaa, opin tämän vasta nyt kantapään kautta:

class Pizza(object):
  tyyppi = 'tavallinen' # tästä tulee luokkamuuttuja

  def __init__(self):
    self.juusto = 'tupla' # tästä tulee instanssimuuttuja

Oleellinen ero on siinä, että luokkamuuttujan muuttaminen vaikuttaa kaikkiin luokan instansseihin:

capricciosa = Pizza()
mexicana = Pizza()
# molemmat ovat tyyppiä 'tavallinen'

Pizza.tyyppi = 'pannu'
# nyt molemmat ovat tyyppiä 'pannu'

En tajunnut tätä heti, koska luokkamuuttujien määrittely näyttää Pythonissa samalta kuin instanssimuuttujien määrittely PHP/Java/C#-tyyppisissä kielissä. Ne kuitenkin vastaavat näiden kielten "static"-muuttujia.

Tätä juttua ei välttämättä huomaa ohjelmoidessa, kunnes jossain vaiheessa asettaa esimerkin mukaisesti Pizza.tyyppi = 'jotain' koko luokalle, ja silloin kaikki objektit muuttuvat kerralla. Luokkamuuttujan voi myös huomaamattaan peittää samannimisellä instanssimuuttujalla:

capricciosa = Pizza()
capricciosa.tyyppi = 'tavallinen'
mexicana = Pizza()
# molemmat ovat tyyppiä 'tavallinen'

Pizza.tyyppi = 'pannu'
# nyt ainoastaan mexicana on tyyppiä 'pannu'

Kyseinen ominaisuus on hyödyllinen ja noudattaa Pythonin logiikkaa, mutta sen kanssa pitää olla tarkkana.

Published 10.7.2009