Miten alla olevassa ohjelmassa Aa kuuluu esitellä Beelle? Yksi tapahan olisi lähettää nimi A Been init-funktioon ja tallentaa se, mutta se rajoittaisi jatkossa instanssien määrän kahteen, sillä enhän voi esitellä Ceetä, kun en ole vielä luonut sellaista. Voinko tehdä instanssien nimistä yhteisiä kaikille käytettäville tiedostoille?
# paaohjelma.py from a import a from b import b def paaohjelma(): A = a() B = b() paaohjelma()
# a.py class a: def __init__(self): self.muuttuja = 0
# b.py class b: def __init__(self): self.muuttuja = A.muuttuja +1 def joku_muu_funktio(self): return self.muuttuja + A.muuttuja
Yleensä luokan nimi kirjoitetaan isolla alkukirjaimella, olion pienellä.
Jos ymmärsin oikein, tässä yksi keino:
# paaohjelma.py from a import A from b import B def paaohjelma(): a = A() b = B(a) paaohjelma()
# a.py class A: def __init__(self): self.muuttuja = 0
# b.py class B: def __init__(self, pohja): self.pohja = pohja self.muuttuja = self.pohja.muuttuja + 1 def joku_muu_funktio(self): return self.muuttuja + self.pohja.muuttuja
Ok, entä kun ohjelmassa on useampia luokkia.
# paaohjelma.py from a import A from b import B from c import C def paaohjelma(): a = A() b = B(a) c = C(b) paaohjelma()
# a.py class A: def __init__(self): self.muuttuja = 7326 def f(self): print self.muuttuja + b.muuttuja print c.muuttuja - self.muuttuja
# b.py class B: def __init__(self,pohja): self.pohja = pohja self.muuttuja = 62 def f(self): print self.muuttuja * c.muuttuja print self.pohja.muuttuja % c.muuttuja
# c.py class C: def __init__(self,pohja): self.pohja = pohja self.muuttuja = 15 def f(self): print self.muuttuja // pohja.muuttuja print self.pohja.pohja.muuttuja **2 + self.muuttuja
Entä miten esittelen c.muuttujan a-oliolle, kun c-oliota ei olla vielä luotu?
Jos kirjoittaisin koko ohjelman yhteen tiedostoon, voisin käyttää yhteisiä muuttujia (global), mutta yhteiset muuttujat ovat yhteisiä vain ko. tiedostossa.
pipo kirjoitti:
Ok, entä kun ohjelmassa on useampia luokkia.
Anna riippuvuudet samaan tapaan konstruktoriparametreinä kuten tuossa edellisessä esimerkissä. Idea on sama riippumatta luokkien ja parametrien määrästä. Tuosta käytetään nimeä dependency injection.
pipo kirjoitti:
Entä miten esittelen c.muuttujan a-oliolle, kun c-oliota ei olla vielä luotu?
Eli syklinen riippuvuussuhde. On parasta, että muutat ohjelman rakennetta siten, ettei syklejä synny. Niissä harvoissa tilanteissa, joissa sykleiltä ei voi välttyä, voi välittää myöhemmin luodun olion aiemmin luodulle oliolle metodin välityksellä ("setter injection").
pipo kirjoitti:
Jos kirjoittaisin koko ohjelman yhteen tiedostoon, voisin käyttää yhteisiä muuttujia (global), mutta yhteiset muuttujat ovat yhteisiä vain ko. tiedostossa.
Globaali muuttuja - hyi. Älä käytä niitä. Aiheeseen liittyvä puhe: http://www.youtube.com/watch?v=-FRm3VPhseI
Aihe on jo aika vanha, joten et voi enää vastata siihen.