Python-klasser og objekter (med eksempler)

I denne vejledning lærer du om kernefunktionaliteten i Python-objekter og klasser. Du lærer, hvad en klasse er, hvordan du opretter den og bruger den i dit program.

Video: Python-klasser og objekter

Python objekter og klasser

Python er et objektorienteret programmeringssprog. I modsætning til procedureorienteret programmering, hvor hovedvægten er på funktioner, lægger objektorienteret programmering vægt på objekter.

Et objekt er simpelthen en samling af data (variabler) og metoder (funktioner), der virker på disse data. Tilsvarende er en klasse en plan for det objekt.

Vi kan tænke på klassen som en skitse (prototype) af et hus. Den indeholder alle detaljer om gulve, døre, vinduer osv. Baseret på disse beskrivelser bygger vi huset. Huset er objektet.

Da mange huse kan laves ud fra et huss tegning, kan vi oprette mange objekter fra en klasse. Et objekt kaldes også en forekomst af en klasse, og processen med at skabe dette objekt kaldes instantiering .

Definition af en klasse i Python

Ligesom funktionsdefinitioner begynder med def-nøgleordet i Python, begynder klassedefinitioner med et klasse-nøgleord.

Den første streng inde i klassen kaldes docstring og har en kort beskrivelse af klassen. Selvom det ikke er obligatorisk, anbefales det stærkt.

Her er en simpel klassedefinition.

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

En klasse opretter et nyt lokalt navneområde, hvor alle dets attributter er defineret. Attributter kan være data eller funktioner.

Der er også specielle attributter i det, der begynder med dobbelt understregning __. __doc__Giver os for eksempel doktringen af ​​denne klasse.

Så snart vi definerer en klasse, oprettes et nyt klasseobjekt med samme navn. Dette klasseobjekt giver os adgang til de forskellige attributter såvel som at instantiere nye objekter i denne klasse.

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

Produktion

 10 Dette er en personklasse

Oprettelse af et objekt i Python

Vi så, at klasseobjektet kunne bruges til at få adgang til forskellige attributter.

Det kan også bruges til at oprette nye objektforekomster (instantiering) af den klasse. Proceduren til at oprette et objekt svarer til et funktionsopkald.

 >>> harry = Person()

Dette vil skabe en ny objektinstans med navnet Harry. Vi kan få adgang til objekternes attributter ved hjælp af objektnavnspræfikset.

Attributter kan være data eller metode. Metoder til et objekt er tilsvarende funktioner i denne klasse.

Dette betyder at sige, da det Person.greeter et funktionsobjekt (attribut 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() 

Produktion

  Hej 

Du har muligvis bemærket selfparameteren i funktionsdefinition inde i klassen, men vi kaldte metoden simpelthen som harry.greet()uden argumenter. Det fungerede stadig.

Dette skyldes, at når et objekt kalder sin metode, sendes objektet i sig selv som det første argument. Så harry.greet()oversættes til Person.greet(harry).

Generelt svarer kald til en metode med en liste over n argumenter til at kalde den tilsvarende funktion med en argumentliste, der oprettes ved at indsætte metodens objekt før det første argument.

Af disse grunde skal funktionens første argument i klassen være selve objektet. Dette kaldes konventionelt selv. Det kan nævnes ellers, men vi anbefaler stærkt at følge konventionen.

Nu skal du være bekendt med klasseobjekt, instansobjekt, funktionsobjekt, metodeobjekt og deres forskelle.

Konstruktører i Python

Klassefunktioner, der begynder med dobbelt understregning __, kaldes specielle funktioner, da de har særlig betydning.

Af en særlig interesse er __init__()funktionen. Denne specielle funktion kaldes, hver gang et nyt objekt i den klasse instantieres.

Denne type funktion kaldes også konstruktører i Object Oriented Programming (OOP). Vi bruger det normalt til at initialisere alle variablerne.

 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)

Produktion

 2 + 3j (5, 0, 10) Traceback (seneste opkald sidst): Fil "", linje 27, i print (num1.attr) AttributeError: 'ComplexNumber' objekt har ingen attribut 'attr'

I ovenstående eksempel definerede vi en ny klasse til at repræsentere komplekse tal. Det har to funktioner, __init__()at initialisere variablerne (standardindstillingen er nul) og get_data()at vise nummeret korrekt.

En interessant ting at bemærke i ovenstående trin er, at egenskaber for et objekt kan oprettes i farten. Vi oprettede en ny attributattr for objekt num2 og læste det også. Men dette skaber ikke denne attribut for objekt num1.

Sletning af attributter og objekter

Enhver attribut for et objekt kan slettes når som helst ved hjælp af deludsagnet. Prøv følgende på Python-skallen for at se output.

 >>> 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 endda slette selve objektet ved hjælp af del-sætningen.

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

Faktisk er det mere kompliceret end det. Når vi gør det c1 = ComplexNumber(1,3), oprettes et nyt instansobjekt i hukommelsen, og navnet c1 binder med det.

På kommandoen del c1fjernes denne binding, og navnet c1 slettes fra det tilsvarende navneområde. Objektet fortsætter dog med at eksistere i hukommelsen, og hvis intet andet navn er bundet til det, ødelægges det senere automatisk.

Denne automatiske ødelæggelse af ikke-henviste objekter i Python kaldes også affaldssamling.

Sletning af objekter i Python fjerner navnebindingen

Interessante artikler...