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'
Link to heading
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'
Link to heading
Kyseinen ominaisuus on hyödyllinen ja noudattaa Pythonin logiikkaa, mutta sen kanssa pitää olla tarkkana.