De methode classmethod () retourneert een klassemethode voor de gegeven functie.
De syntaxis van classmethod()
methode is:
classmethod (functie)
classmethod()
wordt als niet-pythonisch beschouwd, dus in nieuwere Python-versies kunt u de @classmethod
decorateur gebruiken voor de definitie van de classmethod.
De syntaxis is:
@classmethod def func (cls, args …)
classmethod () Parameters
classmethod()
methode heeft een enkele parameter:
- function - Functie die moet worden geconverteerd naar een klassemethode
Retourwaarde van classmethod ()
classmethod()
method geeft een klassemethode terug voor de gegeven functie.
Wat is een klassemethode?
Een klassemethode is een methode die aan een klasse is gebonden in plaats van aan zijn object. Het vereist geen creatie van een klasse-instantie, net als staticmethod.
Het verschil tussen een statische methode en een klassemethode is:
- Statische methode weet niets over de klasse en behandelt alleen de parameters
- Class-methode werkt met de klasse, aangezien de parameter altijd de klasse zelf is.
De class-methode kan zowel door de klasse als door zijn object worden aangeroepen.
Class.classmethod () Of zelfs Class (). Classmethod ()
Maar wat er ook gebeurt, de class-methode is altijd gekoppeld aan een klasse met het eerste argument omdat de klasse zelf cls.
def classMethod (cls, args …)
Voorbeeld 1: maak een klassemethode met classmethod ()
class Person: age = 25 def printAge(cls): print('The age is:', cls.age) # create printAge class method Person.printAge = classmethod(Person.printAge) Person.printAge()
Uitvoer
De leeftijd is: 25
Hier hebben we een klas Person
, met een ledenvariabele leeftijd toegewezen aan 25.
We hebben ook een functie printAge
die een enkele parameter cls nodig heeft en niet die self
we gewoonlijk nemen.
cls accepteert de klasse Person
als een parameter in plaats van het object / de instantie van Persoon.
Nu geven we de methode Person.printAge
als argument door aan de functie classmethod
. Dit converteert de methode naar een klassemethode zodat het de eerste parameter accepteert als een klasse (dwz Persoon).
In de laatste regel bellen we printAge
zonder een Person-object te maken, zoals we doen voor statische methoden. Dit drukt de klasvariabele leeftijd af.
Wanneer gebruik je de klassemethode?
1. Fabrieksmethoden
Fabrieksmethoden zijn die methoden die een klasseobject (zoals constructor) retourneren voor verschillende gebruiksscenario's.
Het is vergelijkbaar met overbelasting van functies in C ++. Omdat Python niets als zodanig heeft, worden klassemethoden en statische methoden gebruikt.
Voorbeeld 2: maak een fabrieksmethode met behulp van de klassemethode
from datetime import date # random Person class Person: def __init__(self, name, age): self.name = name self.age = age @classmethod def fromBirthYear(cls, name, birthYear): return cls(name, date.today().year - birthYear) def display(self): print(self.name + "'s age is: " + str(self.age)) person = Person('Adam', 19) person.display() person1 = Person.fromBirthYear('John', 1985) person1.display()
Uitvoer
Adams leeftijd is: 19 Johns leeftijd is: 31
Hier hebben we de maker van twee klasseninstanties, een constructor en een fromBirthYear
methode.
De constructor gebruikt de normale naam en leeftijd van de parameters. While, fromBirthYear
neemt klasse, naam en geboortejaar, berekent de huidige leeftijd door deze af te trekken van het huidige jaar en retourneert de klasse-instantie.
De fromBirthYear methode neemt Person class (niet Person object) als de eerste parameter cls en retourneert de constructor door aan te roepen cls(name, date.today().year - birthYear)
, wat gelijk is aanPerson(name, date.today().year - birthYear)
Vóór de methode zien we @classmethod
. Dit wordt een decorateur genoemd voor het converteren fromBirthYear
naar een klassemethode als classmethod()
.
2. Correcte aanmaak van instanties in overerving
Telkens wanneer u een klasse afleidt door het implementeren van een fabrieksmethode als een klassemethode, zorgt dit ervoor dat de afgeleide klasse correct wordt aangemaakt.
U kunt een statische methode maken voor het bovenstaande voorbeeld, maar het object dat het maakt, zal altijd als basisklasse worden gecodeerd.
Maar als u een klassemethode gebruikt, wordt de juiste instantie van de afgeleide klasse gemaakt.
Voorbeeld 3: hoe werkt de klassemethode voor de overerving?
from datetime import date # random Person class Person: def __init__(self, name, age): self.name = name self.age = age @staticmethod def fromFathersAge(name, fatherAge, fatherPersonAgeDiff): return Person(name, date.today().year - fatherAge + fatherPersonAgeDiff) @classmethod def fromBirthYear(cls, name, birthYear): return cls(name, date.today().year - birthYear) def display(self): print(self.name + "'s age is: " + str(self.age)) class Man(Person): sex = 'Male' man = Man.fromBirthYear('John', 1985) print(isinstance(man, Man)) man1 = Man.fromFathersAge('John', 1965, 20) print(isinstance(man1, Man))
Uitvoer
Waar onwaar
Als we hier een statische methode gebruiken om een klasse-instantie te maken, moeten we het instantietype hard coderen tijdens het maken.
Dit veroorzaakt duidelijk een probleem bij het erven Person
van Man
.
fromFathersAge
methode retourneert geen Man
object, maar het object van de basisklasse Person
.
Dit is in strijd met het OOP-paradigma. Het gebruik van een class-methode fromBirthYear
kan de OOP-heid van de code garanderen, aangezien deze de eerste parameter als de klasse zelf neemt en de fabrieksmethode aanroept.