A classmethod () metódus egy osztály metódust ad vissza az adott függvényhez.
A classmethod()
módszer szintaxisa :
osztálymódszer (függvény)
classmethod()
nem @classmethod
Pythonic-nak számít , ezért az újabb Python-verziókban a dekoratort használhatja az osztálymódszer meghatározásához.
A szintaxis a következő:
@classmethod def func (cls, args…)
classmethod () Paraméterek
classmethod()
A módszer egyetlen paramétert vesz fel:
- function - Funkció, amelyet osztálymódszerré kell átalakítani
Visszatérési érték az osztálymódszertől ()
classmethod()
A method egy osztályfüggvényt ad vissza az adott függvényhez.
Mi az osztály módszer?
Az osztály metódus az osztályhoz, nem pedig az objektumhoz kötött módszer. Ehhez nem szükséges osztálypéldány létrehozása, csakúgy, mint a statikus módszer.
A statikus és az osztályos módszer közötti különbség a következő:
- A statikus módszer nem tud semmit az osztályról, és csak a paraméterekkel foglalkozik
- A Class módszer az osztállyal működik, mivel a paramétere mindig maga az osztály.
Az class metódust az osztály és az objektuma egyaránt meghívhatja.
Class.classmethod () Vagy akár Class (). Classmethod ()
De nem számít, az class metódus mindig egy osztályhoz van kötve az első argumentummal, mivel maga az osztály cls.
def classMethod (cls, args…)
1. példa: Osztálymódszer létrehozása classmethod () használatával
class Person: age = 25 def printAge(cls): print('The age is:', cls.age) # create printAge class method Person.printAge = classmethod(Person.printAge) Person.printAge()
Kimenet
Az életkor: 25
Itt van egy osztályunk Person
, tagjának változó kora 25 év.
Van egy olyan funkciónk is printAge
, amely egyetlen paramétert vesz cls-re, és nem self
mi szoktuk.
A cls az osztályt Person
paraméterként fogadja el, nem pedig a Person objektumát / példányát.
Most a metódust Person.printAge
argumentumként adjuk át a függvénynek classmethod
. Ez átalakítja a módszert osztály metódussá úgy, hogy az első paramétert osztályként (azaz Személyként) fogadja el.
Az utolsó sorban printAge
személyi objektum létrehozása nélkül hívunk , mint a statikus módszerekhez. Ez kinyomtatja az osztály változó életkorát.
Mikor használja az osztály módszerét?
1. Gyári módszerek
A gyári módszerek azok a módszerek, amelyek osztályobjektumot (például konstruktort) adnak vissza különböző felhasználási esetekhez.
Hasonló a funkció túlterheléséhez C ++ - ban. Mivel a Pythonnak nincs semmi, mint ilyen, osztály- és statikus módszereket használnak.
2. példa: Készítsen gyári módszert osztálymódszerrel
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()
Kimenet
Ádám életkora: 19 János életkora: 31
Itt két osztálypéldány-készítőnk van, egy konstruktor és egy fromBirthYear
módszer.
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.
De ha osztálymódszert használ, akkor létrehozza a levezetett osztály helyes példányát.
3. példa: Hogyan működik az osztály módszer az öröklésnél?
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))
Kimenet
Igaz hamis
Itt egy statikus módszer segítségével osztálypéldány létrehozása azt akarja, hogy a létrehozás során kemény kódot adjunk a példánytípusnak.
Ez egyértelműen okoz problémát, ha örökli Person
a Man
.
fromFathersAge
A metódus nem egy Man
objektumot, hanem annak alaposztályának Person
objektumát adja vissza.
Ez sérti az OOP paradigmáját. A class metódus fromBirthYear
használatával biztosítható a kód OOP-jellege, mivel az első paramétert maga az osztály veszi, és meghívja a gyári metódust.