Tässä opetusohjelmassa opit Python-objektien ja luokkien ydintoiminnoista. Opit mikä luokka on, miten se luodaan ja miten sitä käytetään ohjelmassa.
Video: Python-luokat ja objektit
Python-objektit ja -luokat
Python on olio-ohjelmointikieli. Toisin kuin toimintoperusteinen ohjelmointi, jossa pääpaino on toiminnoissa, olio-ohjelmointi painottaa esineitä.
Kohde on yksinkertaisesti kokoelma tietoja (muuttujia) ja menetelmiä (toimintoja), jotka vaikuttavat näihin tietoihin. Vastaavasti luokka on kyseisen objektin suunnitelma.
Voimme ajatella luokkaa luonnoksena (prototyyppi) talosta. Se sisältää kaikki yksityiskohdat lattiasta, ovista, ikkunoista jne. Näiden kuvausten perusteella rakennamme talon. Talo on esine.
Koska monet talot voidaan tehdä talon suunnitelmasta, voimme luoda monia esineitä luokasta. Objektia kutsutaan myös luokan instanssiksi ja objektin luomisprosessia kutsutaan instantiationiksi .
Luokan määrittäminen Pythonissa
Kuten funktion määritelmät alkavat def-avainsanalla Pythonissa, luokan määritelmät alkavat luokan avainsanalla.
Luokan ensimmäistä merkkijonoa kutsutaan docstringiksi, ja siinä on lyhyt kuvaus luokasta. Vaikka tämä ei ole pakollista, se on erittäin suositeltavaa.
Tässä on yksinkertainen luokan määritelmä.
class MyNewClass: '''This is a docstring. I have created a new class''' pass
Luokka luo uuden paikallisen nimitilan, jossa kaikki sen määritteet on määritelty. Attribuutit voivat olla tietoja tai toimintoja.
Siinä on myös erityisiä määritteitä, jotka alkavat kaksoisviivoin __
. Esimerkiksi __doc__
antaa meille kyseisen luokan opetuksen.
Heti kun määritämme luokan, luodaan uusi luokkaobjekti samalla nimellä. Tämän luokan objektin avulla voimme käyttää erilaisia määritteitä sekä instantisoida tämän luokan uusia objekteja.
class Person: "This is a person class" age = 10 def greet(self): print('Hello') # Output: 10 print(Person.age) # Output: print(Person.greet) # Output: 'This is my second class' print(Person.__doc__)
Tuotos
10 Tämä on henkilöluokka
Objektin luominen Pythonissa
Näimme, että luokkaobjektia voitiin käyttää erilaisiin määritteisiin.
Sitä voidaan käyttää myös luomaan uusia luokan ilmentymiä (instantiation). Objektin luominen on samanlainen kuin toimintokutsu.
>>> harry = Person()
Tämä luo uuden objektin esiintymän nimeltä Harry. Voimme käyttää objektien määritteitä objektinimen etuliitteellä.
Attribuutit voivat olla tietoja tai menetelmiä. Kohteen menetelmät ovat kyseisen luokan vastaavia toimintoja.
Tämä tarkoittaa sitä, että koska Person.greet
se on funktio-objekti (luokan attribuutti), Person.greet
tulee olemaan menetelmäobjekti.
class Person: "This is a person class" age = 10 def greet(self): print('Hello') # create a new object of Person class harry = Person() # Output: print(Person.greet) # Output: print(harry.greet) # Calling object's greet() method # Output: Hello harry.greet()
Tuotos
Hei
Olet ehkä huomannut self
parametrin funktion määritelmässä luokan sisällä, mutta kutsuimme menetelmää yksinkertaisesti harry.greet()
ilman mitään argumentteja. Se toimi edelleen.
Tämä johtuu siitä, että aina kun objekti kutsuu menetelmäänsä, objekti itse lähetetään ensimmäisenä argumenttina. Joten harry.greet()
kääntää Person.greet(harry)
.
Yleensä menetelmän kutsuminen n argumenttiluettelolla vastaa vastaavan funktion kutsumista argumenttiluettelolla, joka on luotu lisäämällä menetelmän objekti ennen ensimmäistä argumenttia.
Näistä syistä luokan funktion ensimmäisen argumentin on oltava objekti itse. Tätä kutsutaan perinteisesti itseksi. Se voidaan nimetä toisin, mutta suosittelemme noudattamaan sopimusta.
Nyt sinun on tunnettava luokan objekti, ilmentymäobjekti, funktioobjekti, menetelmäobjekti ja niiden erot.
Rakentajat Pythonissa
Kaksoisviivalla alkavia luokan toimintoja __
kutsutaan erikoistoiminnoiksi, koska niillä on erityinen merkitys.
Yksi erityinen mielenkiinto on __init__()
toiminto. Tätä erikoistoimintoa kutsutaan aina, kun kyseisen luokan uusi objekti on ilmentynyt.
Tämän tyyppistä toimintoa kutsutaan myös olioorientoidussa ohjelmoinnissa (OOP) konstruktoreiksi. Käytämme sitä yleensä kaikkien muuttujien alustamiseen.
class ComplexNumber: def __init__(self, r=0, i=0): self.real = r self.imag = i def get_data(self): print(f'(self.real)+(self.imag)j') # Create a new ComplexNumber object num1 = ComplexNumber(2, 3) # Call get_data() method # Output: 2+3j num1.get_data() # Create another ComplexNumber object # and create a new attribute 'attr' num2 = ComplexNumber(5) num2.attr = 10 # Output: (5, 0, 10) print((num2.real, num2.imag, num2.attr)) # but c1 object doesn't have attribute 'attr' # AttributeError: 'ComplexNumber' object has no attribute 'attr' print(num1.attr)
Tuotos
2 + 3j (5, 0, 10) Seuranta (viimeisin puhelu viimeisin): Tiedosto "", rivi 27, tulostettuna (num1.attr) AttributeError: Objektilla 'ComplexNumber' ei ole attribuuttia 'attr'
Edellä olevassa esimerkissä määriteltiin uusi luokka edustamaan kompleksilukuja. Siinä on kaksi toimintoa, __init__()
muuttujien alustaminen (oletusarvo on nolla) ja get_data()
numeron näyttäminen oikein.
Mielenkiintoinen asia huomata edellisessä vaiheessa on, että kohteen attribuutteja voidaan luoda lennossa. Olemme luoneet uuden attribuutin attr objektille num2 ja lukeneet sen myös. Mutta tämä ei luo kyseistä määritettä objektille num1.
Attribuuttien ja objektien poistaminen
Objektin minkä tahansa määritteen voi poistaa milloin tahansa del
käskyn avulla. Kokeile seuraavaa Python-kuoressa nähdäksesi tulosteen.
>>> num1 = ComplexNumber(2,3) >>> del num1.imag >>> num1.get_data() Traceback (most recent call last):… AttributeError: 'ComplexNumber' object has no attribute 'imag' >>> del ComplexNumber.get_data >>> num1.get_data() Traceback (most recent call last):… AttributeError: 'ComplexNumber' object has no attribute 'get_data'
Voimme jopa poistaa objektin itse del-käskyn avulla.
>>> c1 = ComplexNumber(1,3) >>> del c1 >>> c1 Traceback (most recent call last):… NameError: name 'c1' is not defined
Itse asiassa se on monimutkaisempi kuin se. Kun teemme c1 = ComplexNumber(1,3)
, uusi ilmentymäobjekti luodaan muistiin ja nimi c1 sitoutuu siihen.
Komennossa del c1
tämä sidonta poistetaan ja nimi c1 poistetaan vastaavasta nimiavaruudesta. Kohde on kuitenkin edelleen olemassa muistissa, ja jos siihen ei ole sidottu muuta nimeä, se tuhoutuu myöhemmin automaattisesti.
Tätä viittaamattomien objektien automaattista tuhoamista Pythonissa kutsutaan myös roskakoriksi.
![](https://cdn.wiki-base.com/5306515/python_classes_and_objects_with_examples.jpg.webp)