ProgrammatiePython-ontwikkelaar

Leg het verschil uit tussen een klasse-methode (@classmethod), een statische methode (@staticmethod) en een gewone instantie-methode in Python. In welke gevallen en wat te kiezen?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

  • Gewone instantie-methode — ontvangt als eerste argument self, dat wil zeggen een verwijzing naar een specifiek object. Wordt gebruikt voor toegang/modificatie van de staat van het object.
  • @classmethod ontvangt als eerste argument cls — een verwijzing naar de klasse zelf, en niet naar het object. Wordt toegepast voor fabrieksmethoden of methoden die met de klasse als geheel werken.
  • @staticmethod ontvangt helemaal geen impliciete argumenten. Dit is een gewone functie, geplaatst in de klasse ruimte — voor logische groepering.

Voorbeeld:

class MyClass: def instance_method(self): print(f"Instantie: {self}") @classmethod def class_method(cls): print(f"Klasse: {cls.__name__}") @staticmethod def static_method(): print("Gewone functie") obj = MyClass() obj.instance_method() # self is obj MyClass.class_method() # cls is MyClass MyClass.static_method() # geen self/cls

Vraag met een valstrik.

Veelgestelde vraag:

Kan een klasse-methode via een instantie worden aangeroepen? Wat is het verschil met aanroepen via de klasse zelf?

Antwoord: Ja, een klasse-methode kan zowel via een instantie als via de klasse zelf worden aangeroepen. Het maakt niet uit waar de aanroep vandaan komt — het eerste argument is altijd de klasse en niet de instantie. Bij aanroepen via de instantie wordt zijn klasse als cls doorgegeven.

Voorbeelden van echte fouten door onwetendheid over de nuances van het onderwerp.


Verhaal

In het project zijn alle fabrieksmethoden statisch gemaakt (@staticmethod), maar van binnenuit moest de naam van de subklasse worden verkregen — dat bleek onmogelijk. Gepubliceerd naar @classmethod om de cls-verwijzing te krijgen.


Verhaal

Voor het genereren van unieke ID's voor instanties werd een gewone methode (self) gebruikt, terwijl het een klasse-methode had moeten zijn, omdat de teller gemeenschappelijk moet zijn voor de klasse en niet voor elk object.


Verhaal

Een ontwikkelaar plaatste bedrijfslogica, die niet gerelateerd was aan de klasse, in een statische methode binnen de klasse. Anderen konden deze functie niet vinden, omdat ze deze niet in de ruimte van een andere klasse verwachtten, wat het onderhoud bemoeilijkte.