Python classmethod ()

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 @classmethoddecorateur 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 printAgedie een enkele parameter cls nodig heeft en niet die selfwe gewoonlijk nemen.

cls accepteert de klasse Personals een parameter in plaats van het object / de instantie van Persoon.

Nu geven we de methode Person.printAgeals 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 printAgezonder 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 fromBirthYearmethode.

De constructor gebruikt de normale naam en leeftijd van de parameters. While, fromBirthYearneemt 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 fromBirthYearnaar 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 Personvan Man.

fromFathersAgemethode retourneert geen Manobject, maar het object van de basisklasse Person.

Dit is in strijd met het OOP-paradigma. Het gebruik van een class-methode fromBirthYearkan de OOP-heid van de code garanderen, aangezien deze de eerste parameter als de klasse zelf neemt en de fabrieksmethode aanroept.

Interessante artikelen...