Μέθοδος Python class)

Η μέθοδος classmethod () επιστρέφει μια μέθοδο κλάσης για τη δεδομένη συνάρτηση.

Η σύνταξη της classmethod()μεθόδου είναι:

 μέθοδος τάξης (συνάρτηση)

classmethod()θεωρείται μη-Pythonic, οπότε σε νεότερες εκδόσεις Python, μπορείτε να χρησιμοποιήσετε τον @classmethodδιακοσμητή για τον ορισμό της μεθόδου classm.

Η σύνταξη είναι:

 @classmethod def func (cls, args…)

classmethod () Παράμετροι

classmethod() Η μέθοδος παίρνει μία μόνο παράμετρο:

  • function - Λειτουργία που πρέπει να μετατραπεί σε μέθοδο κλάσης

Επιστροφή τιμής από classmethod ()

classmethod() Η μέθοδος επιστρέφει μια μέθοδο κλάσης για τη δεδομένη συνάρτηση.

Τι είναι μια μέθοδος τάξης;

Μια μέθοδος κλάσης είναι μια μέθοδος που συνδέεται με μια τάξη και όχι με το αντικείμενο της. Δεν απαιτεί τη δημιουργία μιας παρουσίας τάξης, όπως η στατική μέθοδος.

Η διαφορά μεταξύ μιας στατικής μεθόδου και μιας μεθόδου κλάσης είναι:

  • Η στατική μέθοδος δεν γνωρίζει τίποτα για την τάξη και απλώς ασχολείται με τις παραμέτρους
  • Η μέθοδος Class λειτουργεί με την κλάση αφού η παράμετρος της είναι πάντα η ίδια η κλάση.

Η μέθοδος κλάσης μπορεί να κληθεί τόσο από την τάξη όσο και από το αντικείμενο της.

 Class.classmethod () Ή ακόμη και Class (). Classmethod ()

Αλλά ανεξάρτητα από το τι, η μέθοδος τάξης είναι πάντα συνδεδεμένη με μια τάξη με το πρώτο επιχείρημα, όπως η ίδια η τάξη.

 def classMethod (cls, args…)

Παράδειγμα 1: Δημιουργία μεθόδου κλάσης χρησιμοποιώντας 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()

Παραγωγή

 Η ηλικία είναι: 25 

Εδώ, έχουμε μια τάξη Person, με μεταβλητή ηλικία μέλους που έχει ανατεθεί σε 25.

Έχουμε επίσης μια συνάρτηση printAgeπου παίρνει μία παράμετρο cls και όχι selfσυνήθως.

Το cls αποδέχεται την κλάση Personως παράμετρο και όχι ως αντικείμενο / παρουσία του ατόμου.

Τώρα, περνάμε τη μέθοδο Person.printAgeως όρισμα στη συνάρτηση classmethod. Αυτό μετατρέπει τη μέθοδο σε μέθοδο κλάσης έτσι ώστε να δέχεται την πρώτη παράμετρο ως κλάση (δηλαδή Πρόσωπο).

Στην τελική γραμμή, καλούμε printAgeχωρίς να δημιουργήσουμε ένα αντικείμενο Person όπως κάνουμε για στατικές μεθόδους. Αυτό εκτυπώνει την τάξη μεταβλητή ηλικία.

Πότε χρησιμοποιείτε τη μέθοδο κλάσης;

1. Εργοστασιακές μέθοδοι

Οι εργοστασιακές μέθοδοι είναι εκείνες οι μέθοδοι που επιστρέφουν ένα αντικείμενο κλάσης (όπως κατασκευαστής) για διαφορετικές περιπτώσεις χρήσης.

Είναι παρόμοιο με τη λειτουργία υπερφόρτωσης στο C ++. Δεδομένου ότι, η Python δεν έχει τίποτα ως τέτοιο, χρησιμοποιούνται μέθοδοι κατηγορίας και στατικές μέθοδοι.

Παράδειγμα 2: Δημιουργία εργοστασιακής μεθόδου χρησιμοποιώντας μέθοδο κλάσης

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

Παραγωγή

 Η ηλικία του Αδάμ είναι: 19 Η ηλικία του Ιωάννη είναι: 31 

Εδώ, έχουμε δύο δημιουργούς παρουσίας κατηγορίας, έναν κατασκευαστή και μια fromBirthYearμέθοδο.

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.

Όμως, όταν χρησιμοποιείτε μια μέθοδο κλάσης, δημιουργεί τη σωστή παρουσία της παραγόμενης κλάσης.

Παράδειγμα 3: Πώς λειτουργεί η μέθοδος κλάσης για την κληρονομιά;

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

Παραγωγή

 Σωστό Λάθος 

Εδώ, χρησιμοποιώντας μια στατική μέθοδο για τη δημιουργία μιας παρουσίας τάξης, θέλουμε να κωδικοποιήσουμε τον τύπο παρουσίας κατά τη δημιουργία.

Αυτό προκαλεί σαφώς ένα πρόβλημα όταν κληρονομεί Personνα Man.

fromFathersAgeΗ μέθοδος δεν επιστρέφει ένα Manαντικείμενο αλλά το αντικείμενο της βασικής κλάσης Person.

Αυτό παραβιάζει το πρότυπο OOP. Χρησιμοποιώντας μια μέθοδο κλάσης που fromBirthYearμπορεί να διασφαλίσει την OOP-ness του κώδικα, δεδομένου ότι παίρνει την πρώτη παράμετρο ως ίδια την κλάση και καλεί την εργοστασιακή της μέθοδο.

ενδιαφέροντα άρθρα...