Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python oliot

Isopaha [20.01.2009 17:14:10]

#

Terveppä taas. Tällä kertaa kyselisin hieman taas olioista ja niiden toimimattomuudesta.

Elikkäs jos minulla on kaks oliota, nimetään ne vaikka sanoilla Yksi ja Kaksi. Koodi, jossa oliot luodaan on tämän näköinen:

class Yksi():
    def TeeJotain(self):
        kaksi.TeeJotain()

class Kaksi():
    def TeeJotain(self):
        yksi.TeeJotain()

def main():
    #Alustaminen
    yksi = Yksi()
    kaksi = Kaksi()

    #Kutsutaan funktioita
    yksi.TeeJotain()


if __name__ == '__main__':
    main()

Tätä koodia käytettäessä saan vain virheilmoituksen:
NameError: global name 'kaksi' is not defined

Mutta, jos muutan koodia niin, että olioita ei luoda main()-funktion sisällä vaan ulkopuolella koodia, esim. siinä missä nyt kutsutaan main()-funktiota, niin koodi toimii mainiosti (tai tässä tapauksessa ohjelma ei varsinaisesti toimi oikein vaan se kutsuu loputtomasti ristikkäisiä funktioita :D).

Viitsisikö joku vaivautua kertomaan minulle mikä main()-funktion sisällä kutsumisessa mättää ja kenties jonkinnäköistä ratkaisua.

trilog [20.01.2009 17:18:35]

#

Kyseiset muuttujat ovat voimassa vain funktion sisällä. Saat ne toimimaan määrittelemällä ne globaaliksi, tätä ei kuitenkaan useasti suositella.

def main():
    global yksi, kaksi
    #Alustaminen
    yksi = Yksi()
    kaksi = Kaksi()

    #Kutsutaan funktioita
    yksi.TeeJotain()

Isopaha [20.01.2009 17:22:40]

#

Kiitos nopeasta vastauksesta. Tarkoittaako tämä käytännössä sitä, että minun olisi suoritettava main()-funktion tapahtumat vain muualla kuin siellä?

trilog [20.01.2009 17:24:17]

#

Isopaha kirjoitti:

Kiitos nopeasta vastauksesta. Tarkoittaako tämä käytännössä sitä, että minun olisi suoritettava main()-funktion tapahtumat vain muualla kuin siellä?

Itse tekisin niin, ellei jotakin erityistä syytä ole niitä tuohon main-funktioon laittaa.

Isopaha [20.01.2009 17:27:32]

#

Lähinnä järjestelyn vuoksi nuo oli tuolla main:issa, mutta eipä se ole suuri vaiva siirtää niitä pois. Kiitos, asia on tällä selvä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta