Ubuntun käyttö > Ohjelmointi, palvelimet ja muu edistyneempi käyttö

Python viittaus perityn luokan jäseneen

(1/2) > >>

ilkant:
Kokeilin FaceBookin esimerkkiohjelmaa


--- Koodia: ---class Sport:
    def __init__(self, name):
        self.name = name

class Football(Sport):
    def __init__(self, teams):
        self.teams = teams

    def match(self):
        return f"{self.name} match: {self.teams[0]} vs {self.teams[1]}"

print(Football(["Team A", "Team B"]).match())

--- Koodi päättyy ---

Koneessa on Kubuntu 23.10 ja python versio 3.11.6.

Eikö tuon pitäisi toimia? Tarkoittaa, että luokka Football perii luokan Sport attribuutin name ja sitä voi käyttää luokassa Football. Antaa kuitenkin virheilmoituksen:


--- Koodia: ---AttributeError: 'Football' object has no attribute 'name'

--- Koodi päättyy ---

Onko kysymys pythonin version bugista? Vai onko pythonissa joku erityinen tapa viitata perittyyn luokkaan? Pieni googlaus ei tuonut vastausta.

Tomin:
Lisää konstruktoriin (__init__) kutsu yläluokan konstruktoriin. Esimerkiksi:

--- Koodia: ---    def __init__(self, name, teams):
        super().__init__(name)
        self.teams = teams

--- Koodi päättyy ---

SuperOscar:
Tuohon voisi vielä jatkaa, että jos Sport.name on ajateltu lajin nimeksi, ehkä johdannaisluokan pitäisi asettaa se:


--- Koodia: ---class Football(Sport):
    def __init__(self, teams):
        super().__init__('Football')
        # …
--- Koodi päättyy ---

ilkant:
Kiitokset vastauksista!

Sitä jään ihmettelemään kun siellä FaceBook-ryhmässä oli sitten monivalintana vaihtoehtoja, mitä ohjelma tulostaa. Ja monet vastasivat siihen yhdellä vaihtoehdolla. Mielestäni tässä voi ajatella, että some muokkaa ajatusmaailmaa niin, että se muuttuu virtuaaliseksi. Ja siis nyt ei edes tulla ajatelleeksi, että ohjelma ei toimi edes. Noitten vastausten takia epäilin, että python-kääntäjässä on bugi. Nimittäin tarkistin, että en ole tehnyt mitään kirjoitusvirhettä kirjoittaessani valokuvasta koodit tekstieditorilla.

Oma taustani on Java-maailmasta. Olen omin päin sitten opetellut Pythonia. Ja kommelluksin. Esimerkiksi silloin opettelun alussa tein luokan ja konstruktorin. Vahingossa olin katsonut, että initissä pitää olla kolme alaviivaa. No kun kysyin FaceBookissa, miksei ohjelma toimi, niin osa nauroi. Kukaan ei vastannut sitä oikeaa syytä. Se selvisi sitten sattumalta. Ja luokan attribuuttien olemassaolo (eksistenssi) oli uutta, jolla Pythonilla voi kikkailla kun Javalla ei sellaisia voi tehdä. Esim. ettei luokassa tarvitse määritellä attribuutteja vaan niitä voi lisätä ajon aikana. Toivottavasti olen ymmärtänyt oikein.

Pythonilla aloin tehdä yhtä (minulle) kohtalaisen laajaa ohjelmaa. Aluksi hämmästelin, miten ilmaisuvoimainen Python on. Paljon vähemmällä koodilla tekee paljon. Esimerkiksi funktioiden parametrin välityksessä ei tarvita niin tiukkaa tyypitystä kuin Javassa. Ja paljon muuta.

Ja tuossa esitetyssä ohjelmapätkässä kuvittelin, että tuo super tapahtuu automaattisesti ilman erillistä ohjeistusta. Kuten monet muut toiminnot esim. listojen käsittelyssä yms.

SuperOscar:

--- Lainaus käyttäjältä: ilkant - 06.01.24 - klo:03.16 ---Ja siis nyt ei edes tulla ajatelleeksi, että ohjelma ei toimi edes. Noitten vastausten takia epäilin, että python-kääntäjässä on bugi. Nimittäin tarkistin, että en ole tehnyt mitään kirjoitusvirhettä kirjoittaessani valokuvasta koodit tekstieditorilla.
--- Lainaus päättyy ---

Yksi mahdollisuus on, että koodi on Python 2:sta, mutta Python 3 käyttäytyy eri lailla. En pääse tarkistamaan, koska Python 2:ta ei enää koneella ole.


--- Lainaus ---Ja tuossa esitetyssä ohjelmapätkässä kuvittelin, että tuo super tapahtuu automaattisesti ilman erillistä ohjeistusta.
--- Lainaus päättyy ---

En muista yksityiskohtia, mutta kokeilemallakin selviää, että metodit periytyvät ilman super().__init__()-kutsuakin.

Vinkiksi voisin antaa dir()-funktion, jolla näkee kivasti aina olion nimiavaruuden mm. metodit ja instanssimuuttujat. Kokeile esimerkiksi:


--- Koodia: ---f = Football(['Team A', 'Team B'])
dir(f)
--- Koodi päättyy ---

Navigaatio

[0] Viestien etusivu

[#] Seuraava sivu

Siirry pois tekstitilasta