Python-klasser og objekter (med eksempler)

I denne veiledningen vil du lære om kjernefunksjonaliteten til Python-objekter og klasser. Du lærer hva en klasse er, hvordan du lager den og bruker den i programmet ditt.

Video: Python-klasser og objekter

Python-objekter og klasser

Python er et objektorientert programmeringsspråk. I motsetning til prosessorientert programmering, hvor hovedvekten er på funksjoner, legger objektorientert programmering vekt på objekter.

Et objekt er ganske enkelt en samling av data (variabler) og metoder (funksjoner) som virker på disse dataene. Tilsvarende er en klasse en tegning for det objektet.

Vi kan tenke på klassen som en skisse (prototype) av et hus. Den inneholder alle detaljene om gulv, dører, vinduer etc. Basert på disse beskrivelsene bygger vi huset. Huset er objektet.

Siden mange hus kan lages fra tegningen til et hus, kan vi lage mange gjenstander fra en klasse. Et objekt kalles også en forekomst av en klasse, og prosessen med å lage dette objektet kalles instantiering .

Definere en klasse i Python

Som funksjonsdefinisjoner begynner med def-nøkkelordet i Python, begynner klassedefinisjoner med et klassens nøkkelord.

Den første strengen inne i klassen kalles docstring og har en kort beskrivelse av klassen. Selv om det ikke er obligatorisk, anbefales dette sterkt.

Her er en enkel klassedefinisjon.

 class MyNewClass: '''This is a docstring. I have created a new class''' pass

En klasse oppretter et nytt lokalt navneområde der alle attributtene er definert. Attributter kan være data eller funksjoner.

Det er også spesielle egenskaper i den som begynner med doble understrekninger __. For eksempel __doc__gir oss docstring av klassen.

Så snart vi definerer en klasse, opprettes et nytt klasseobjekt med samme navn. Dette klasseobjektet lar oss få tilgang til de forskjellige attributtene, så vel som å sette i gang nye objekter i den klassen.

 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__)

Produksjon

 10 Dette er en personerklasse

Opprette et objekt i Python

Vi så at klasseobjektet kunne brukes til å få tilgang til forskjellige attributter.

Den kan også brukes til å lage nye objektforekomster (instantiering) av den klassen. Fremgangsmåten for å lage et objekt ligner på en funksjonsanrop.

 >>> harry = Person()

Dette vil opprette en ny objektforekomst som heter Harry. Vi har tilgang til attributtene til objekter ved å bruke prefiks for objektnavnet.

Attributter kan være data eller metode. Metoder for et objekt er tilsvarende funksjoner i den klassen.

Dette betyr å si, siden Person.greeter et funksjonsobjekt (attributt for klasse), Person.greetvil være et metodeobjekt.

 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() 

Produksjon

  Hallo 

Du har kanskje lagt merke til selfparameteren i funksjonsdefinisjon inne i klassen, men vi kalte metoden ganske enkelt som harry.greet()uten noen argumenter. Det virket fremdeles.

Dette er fordi, når et objekt kaller metoden, blir selve objektet sendt som det første argumentet. Så, harry.greet()oversettes til Person.greet(harry).

Generelt tilsvarer å kalle en metode med en liste med n argumenter å kalle den tilsvarende funksjonen med en argumentliste som er opprettet ved å sette inn metodens objekt før det første argumentet.

Av disse grunner må det første argumentet til funksjonen i klassen være selve objektet. Dette kalles konvensjonelt selv. Det kan hetes ellers, men vi anbefaler på det sterkeste å følge stevnet.

Nå må du være kjent med klasseobjekt, forekomstobjekt, funksjonsobjekt, metodeobjekt og deres forskjeller.

Konstruktører i Python

Klassefunksjoner som begynner med dobbelt understreking __kalles spesialfunksjoner ettersom de har spesiell betydning.

Av en spesiell interesse er __init__()funksjonen. Denne spesielle funksjonen blir kalt når et nytt objekt i den klassen blir instansert.

This type of function is also called constructors in Object Oriented Programming (OOP). We normally use it to initialize all the variables.

 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)

Output

 2+3j (5, 0, 10) Traceback (most recent call last): File "", line 27, in print(num1.attr) AttributeError: 'ComplexNumber' object has no attribute 'attr'

In the above example, we defined a new class to represent complex numbers. It has two functions, __init__() to initialize the variables (defaults to zero) and get_data() to display the number properly.

An interesting thing to note in the above step is that attributes of an object can be created on the fly. We created a new attribute attr for object num2 and read it as well. But this does not create that attribute for object num1.

Deleting Attributes and Objects

Ethvert attributt til et objekt kan slettes når som helst, ved hjelp av deluttalelsen. Prøv følgende på Python-skallet for å se utdataene.

 >>> 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'

Vi kan til og med slette selve objektet ved å bruke del-setningen.

 >>> c1 = ComplexNumber(1,3) >>> del c1 >>> c1 Traceback (most recent call last):… NameError: name 'c1' is not defined

Egentlig er det mer komplisert enn det. Når vi gjør det c1 = ComplexNumber(1,3), opprettes et nytt forekomstobjekt i minnet, og navnet c1 binder med det.

På kommandoen del c1blir denne bindingen fjernet og navnet c1 slettet fra det tilsvarende navneområdet. Objektet fortsetter imidlertid å eksistere i minnet, og hvis ingen andre navn er bundet til det, blir det senere automatisk ødelagt.

Denne automatiske ødeleggelsen av objekter uten referanse i Python kalles også søppeloppsamling.

Slette objekter i Python fjerner navnebindingen

Interessante artikler...