In Python zijn er drie hoofdtypen methoden: instancemethoden, klassenmethoden en statische methoden. Historisch gezien ondersteunde Python alleen instancemethoden (met de eerste parameter self). Door de tijd heen ontstond de behoefte aan extra soorten methoden: toegankelijk via de klasse zonder binding aan een object en met toegang tot de klasse zelf.
Probleem: vaak is het nodig om methoden te maken die niet afhankelijk zijn van de staat van het object (bijvoorbeeld fabrieksmethoden) of helemaal geen klasse context nodig hebben, maar logisch in de structuren van de klasse passen.
Oplossing: decorators @classmethod en @staticmethod worden gebruikt.
Voorbeeldcode:
class Voorbeeld: def instancemethode(self): return f'instantie: {self}' @classmethod def klassenmethode(cls): return f'klasse: {cls}' @staticmethod def statische_methode(): return 'statisch'
Belangrijke kenmerken:
Kan een statische methode toegang krijgen tot de attributen van de klasse en de instantie?
Nee, een statische methode krijgt geen verwijzing naar de klasse of het object.
class A: x = 10 @staticmethod def f(): # print(self.x) # Fout pass
Kunnen klassenmethoden worden overschreven in afgeleiden klassen?
Ja, bij het aanroepen van classmethod via een afgeleide is de eerste argument altijd de feitelijke klasse, niet de ouder.
class Basis: @classmethod def naam(cls): return cls.__name__ class Kind(Basis): pass Kind.naam() # "Kind"
Waarom kan ik self niet gebruiken voor klassenmethoden?
Omdat de klassenmethode niet is gekoppeld aan een specifiek object, maar aan de klasse als geheel; self is niet toegankelijk zonder een instantie te maken.
Een fabrieksmethode is als staticmethod gedefinieerd, maar probeert binnenin een instantie van de klasse te maken via self, wat leidt tot fouten of duplicatie van code.
Voordelen:
Nadelen:
De fabriek is gedefinieerd via classmethod, en binnenin wordt de feitelijke klasse (cls) gebruikt om een instantie te maken. Afgeleiden worden correct gemaakt via deze fabriek.
Voordelen:
Nadelen: