Python klassemetode ()

Metoden classmethod () returnerer en klassemetode for den gitte funksjonen.

Syntaksen for classmethod()metoden er:

 klassemetode (funksjon)

classmethod()regnes som un-pythonic, så i nyere Python-versjoner kan du bruke @classmethoddekoratøren for definisjon av klassemetode.

Syntaksen er:

 @classmethod def func (cls, args …)

classmethod () Parametere

classmethod() metoden tar en enkelt parameter:

  • function - Funksjon som må konverteres til en klassemetode

Returverdi fra klassemetode ()

classmethod() metoden returnerer en klassemetode for den gitte funksjonen.

Hva er en klassemetode?

En klassemetode er en metode som er bundet til en klasse i stedet for dens objekt. Det krever ikke oppretting av en klasseinstans, omtrent som statisk metode.

Forskjellen mellom en statisk metode og en klassemetode er:

  • Statisk metode vet ingenting om klassen og handler bare om parametrene
  • Klassemetoden fungerer med klassen siden parameteren alltid er selve klassen.

Klassemetoden kan kalles både av klassen og dens objekt.

 Class.classmethod () Eller til og med Class (). Classmethod ()

Men uansett hva, klassemetoden er alltid knyttet til en klasse med det første argumentet slik klassen selv kl.

 def classMethod (cls, args …)

Eksempel 1: Opprett klassemetode ved bruk av 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()

Produksjon

 Alderen er: 25 

Her har vi en klasse Personmed en variabel aldersgrense på 25.

Vi har også en funksjon printAgesom tar en enkelt parameter cls, og ikke selfvanligvis tar vi.

cls aksepterer klassen Personsom en parameter i stedet for Persons objekt / forekomst.

Nå sender vi metoden Person.printAgesom et argument til funksjonen classmethod. Dette konverterer metoden til en klassemetode slik at den aksepterer den første parameteren som en klasse (dvs. person).

I sluttlinjen ringer vi printAgeuten å lage et personobjekt som vi gjør for statiske metoder. Dette skriver ut klassens variable alder.

Når bruker du klassemetoden?

1. Fabrikkmetoder

Fabrikkmetoder er de metodene som returnerer et klasseobjekt (som konstruktør) for forskjellige bruksområder.

Det ligner på funksjonsoverbelastning i C ++. Siden Python ikke har noe som sådan, brukes klassemetoder og statiske metoder.

Eksempel 2: Lag fabrikkmetode ved bruk av klassemetoden

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

Produksjon

 Adams alder er: 19 Johns alder er: 31 

Her har vi to klasse instans skapere, en konstruktør og en fromBirthYearmetode.

The constructor takes normal parameters name and age. While, fromBirthYear takes class, name and birthYear, calculates the current age by subtracting it with the current year and returns the class instance.

The fromBirthYear method takes Person class (not Person object) as the first parameter cls and returns the constructor by calling cls(name, date.today().year - birthYear), which is equivalent to Person(name, date.today().year - birthYear)

Before the method, we see @classmethod. This is called a decorator for converting fromBirthYear to a class method as classmethod().

2. Correct instance creation in inheritance

Whenever you derive a class from implementing a factory method as a class method, it ensures correct instance creation of the derived class.

You can create a static method for the above example but the object it creates, will always be hardcoded as Base class.

Men når du bruker en klassemetode, skaper den riktig forekomst av den avledede klassen.

Eksempel 3: Hvordan klassemetoden fungerer for arven?

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

Produksjon

 True False 

Her bruker vi en statisk metode for å opprette en klasseinstans at vi hardkoder forekomstypen under opprettelsen.

Dette forårsaker helt klart et problem når du arver Persontil Man.

fromFathersAgemetoden returnerer ikke et Manobjekt, men Personobjektet til baseklassen.

Dette bryter med OOP-paradigmet. Ved å bruke en klassemetode som fromBirthYearkan sikre OOP-ness av koden siden den tar den første parameteren som klassen selv og kaller fabrikkmetoden.

Interessante artikler...