Python-klassen en -objecten (met voorbeelden)

In deze tutorial leer je over de kernfunctionaliteit van Python-objecten en -klassen. U leert wat een klas is, hoe u deze kunt maken en hoe u deze in uw programma kunt gebruiken.

Video: Python-klassen en -objecten

Python-objecten en -klassen

Python is een objectgeoriënteerde programmeertaal. In tegenstelling tot proceduregeoriënteerd programmeren, waarbij de nadruk ligt op functies, legt objectgeoriënteerd programmeren de nadruk op objecten.

Een object is gewoon een verzameling gegevens (variabelen) en methoden (functies) die op die gegevens inwerken. Evenzo is een klasse een blauwdruk voor dat object.

We kunnen klasse zien als een schets (prototype) van een huis. Hierin staan ​​alle details over de vloeren, deuren, ramen etc. Op basis van deze beschrijvingen bouwen we het huis. Huis is het object.

Omdat er veel huizen kunnen worden gemaakt van de blauwdruk van een huis, kunnen we veel objecten uit een klas maken. Een object wordt ook wel een instantie van een klasse genoemd en het proces van het maken van dit object wordt instantiatie genoemd .

Een klasse definiëren in Python

Zoals functiedefinities beginnen met het trefwoord def in Python, beginnen klassedefinities met een class-trefwoord.

De eerste string in de klasse heet docstring en bevat een korte beschrijving van de klasse. Hoewel dit niet verplicht is, wordt dit sterk aanbevolen.

Hier is een eenvoudige klassendefinitie.

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

Een klasse maakt een nieuwe lokale naamruimte waar al zijn attributen zijn gedefinieerd. Attributen kunnen gegevens of functies zijn.

Er staan ​​ook speciale attributen in die beginnen met dubbele onderstrepingstekens __. Bijvoorbeeld, __doc__geeft ons de docstring van die klasse.

Zodra we een klasse definiëren, wordt een nieuw klasseobject gemaakt met dezelfde naam. Met dit klasseobject hebben we toegang tot de verschillende attributen en kunnen we nieuwe objecten van die klasse instantiëren.

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

Uitvoer

 10 Dit is een persoonsklasse

Een object maken in Python

We zagen dat het klasseobject kan worden gebruikt om toegang te krijgen tot verschillende attributen.

Het kan ook worden gebruikt om nieuwe objectinstanties (instantiatie) van die klasse te maken. De procedure om een ​​object te maken is vergelijkbaar met een functieaanroep.

 >>> harry = Person()

Hiermee wordt een nieuwe objectinstantie gemaakt met de naam harry. We hebben toegang tot de attributen van objecten met behulp van het voorvoegsel van de objectnaam.

Attributen kunnen gegevens of methode zijn. Methoden van een object zijn overeenkomstige functies van die klasse.

Dit betekent dat, aangezien Person.greetis een functieobject (attribuut van klasse), Person.greeteen methodeobject zal zijn.

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

Uitvoer

  Hallo 

Je hebt misschien de selfparameter opgemerkt in de functiedefinitie in de klasse, maar we hebben de methode gewoon harry.greet()zonder argumenten aangeroepen . Het werkte nog steeds.

Dit komt doordat, telkens wanneer een object zijn methode aanroept, het object zelf wordt doorgegeven als het eerste argument. Dus harry.greet()vertaalt zich in Person.greet(harry).

In general, calling a method with a list of n arguments is equivalent to calling the corresponding function with an argument list that is created by inserting the method's object before the first argument.

For these reasons, the first argument of the function in class must be the object itself. This is conventionally called self. It can be named otherwise but we highly recommend to follow the convention.

Now you must be familiar with class object, instance object, function object, method object and their differences.

Constructors in Python

Class functions that begin with double underscore __ are called special functions as they have special meaning.

Of one particular interest is the __init__() function. This special function gets called whenever a new object of that class is instantiated.

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

Elk attribuut van een object kan op elk moment worden verwijderd met behulp van de delinstructie. Probeer het volgende op de Python-shell om de uitvoer te zien.

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

We kunnen zelfs het object zelf verwijderen met de instructie del.

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

Eigenlijk is het ingewikkelder dan dat. Wanneer we dat doen c1 = ComplexNumber(1,3), wordt een nieuw exemplaarobject in het geheugen gemaakt en de naam c1 bindt eraan.

Op het commando del c1wordt deze binding verwijderd en wordt de naam c1 verwijderd uit de corresponderende naamruimte. Het object blijft echter in het geheugen bestaan ​​en als er geen andere naam aan is gebonden, wordt het later automatisch vernietigd.

Deze automatische vernietiging van objecten zonder verwijzing in Python wordt ook wel garbage collection genoemd.

Als u objecten in Python verwijdert, wordt de naambinding verwijderd

Interessante artikelen...