Python gyerekeknek - osztályok

Kategória: Python gyerekeknek.

Elmélet

A szorosan összetartozó függvényeket és változókat külön helyre, ún. osztályokba tudjuk szervezni. Például:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
 
    def print_info(self):
        print(self.name + ' ' + str(self.age) + ' éves.')
 
person1 = Person('Pista', 17)
person2 = Person('Jóska', 46)
person3 = Person('Marika', 23)
 
print(person1.name)
print(person1.age)
person1.print_info()
person2.print_info()
person3.print_info()

Ennek eredménye:

Pista
17
Pista 17 éves.
Jóska 46 éves.
Marika 23 éves.

Vizsgáljuk meg a fenti kódot!

  • A class kulcsszóval indul.
  • Utána jön az osztály neve. Ezt általában nagy kezdőbetűvel írjuk. Ebben a példában ez a Person, ami személyt jelent angolul.
  • Az első sor itt is kettősponttal zárul, és a belseje ugyanúgy beljebb van húzva, mint az elágazásoknál és a ciklusoknál.
  • A def init részt létrehozónak, idegen szóval konstruktornak hívjuk. Az init az angol initialize szó rövidítése, ami kezdeti beállítást jelent. Ennek mindenképpen ez kell, hogy legyen a neve.
  • Az első paraméter "foglalt"; általában self.
  • A példában van még két paraméter: name (név) és age (életkor).
  • A self.name = name és a self.age = age elmentik a paraméterül kapott értékeket, hogy később is fel tudjuk használni. A self után megadott értékeket adatmezőknek hívjuk.
  • A def print_info(self): a Person osztály másik függvénye. Itt is kötelezően meg kellett adni azt, hogy self, egyébként ennek a példában nincs paramétere.
  • A print(self.name + ' ' + str(self.age) + ' éves.') kiírja az illető nevét, és azt, hogy hány éves. Figyeljük meg azt, hogy a self-en keresztül érjük el azt, amit az init függvényben beállítottunk!
  • person1 = Person('Pista', 17), person2 = Person('Jóska', 46) és person3 = Person('Marika', 23): ezeket példányosításnak hívjuk: konkrét értékeket adnunk nekik.
  • person1.name és person1.age: így tudjuk az egyes adatmezőket elérni kívülről, közvetlenül.
  • A person1.print_info() (és a másik kettő) azt mutatja meg, hogy hogyan tudunk függvényt hívni egy osztályon. Figyeljük meg, hogy mindegyik függvény a saját információit írja ki.

Általában az adatmezőket kívülről nem szoktuk közvetlenül használni, hanem csak függvényeken keresztül.

Osztályok a Scratch-ben külön nincsenek, ám egész jól lehet a lehetőséget szimulálni a másolatot készítő utasításokkal, valamint olyan változókkal, amelyek a kiválasztott szereplőhöz tartoznak.

scratch_masolat.png

Feladat

Készítsük el a kvíz osztályokkal megvalósított változatát! Egy osztály tartalmazza a következőket:

  • A kérdés.
  • A helyes válasz.
  • Egy függvény, ami kiírja a kérdést, bekéri a választ, és megfelelően kezeli azt.

Példányosítsunk 5 kérdést, tegyük bele egy listába, és azokon lépegessünk végig.

class Question:
    def __init__(self, question, correct_answer):
        self.question = question
        self.correct_answer = correct_answer
 
    def check_answer(self):
        answer = input(self.question)
        if answer == self.correct_answer:
            print('Helyes!')
            return True
        else:
            print(f'A válasz helytelen; a helyes válasz {self.correct_answer} lett volna.')
            return False
 
questions = []
questions.append(Question('Mi Magyarország fővárosa? ', 'Budapest'))
questions.append(Question('Hány fokon forr a víz? ', '100'))
questions.append(Question('Melyik az az állat, amelyiknek nagy füle és hosszú ormánya van? ', 'elefánt'))
questions.append(Question('Hogy mondjuk angolul azt, hogy alma? ', 'apple'))
questions.append(Question('Mi volt Petőfi vezetéknevű költőnk keresztneve? ', 'Sándor'))
 
points = 0
for question in questions:
    result = question.check_answer()
    if result:
        points = points + 1
    print()
percentage = str(100 * points / len(questions)) + '%'
print('Az eredmény: ' + percentage)

Önálló feladat

Egészítsük ki a Question osztályt egy típus adatmezővel. A típus lehet kiegészítés (mint fent), szám, több válaszlehetőségből egy stb. A check_answer függvényt ennek alapján módosítsuk.

Teszt

TODO

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License