क्लासमेथोड () विधि दिए गए फ़ंक्शन के लिए एक क्लास विधि लौटाती है।
classmethod()
विधि का सिंटैक्स है:
classmethod (फ़ंक्शन)
classmethod()
नए पायथन संस्करणों में अन-पाइथोनिक माना जाता है, इसलिए आप @classmethod
क्लासमैथोड परिभाषा के लिए डेकोरेटर का उपयोग कर सकते हैं ।
वाक्य रचना है:
@classmethod def func (cls, args…)
classmethod () पैरामीटर
classmethod()
विधि एक एकल पैरामीटर लेता है:
- फ़ंक्शन - फ़ंक्शन जिसे क्लास विधि में परिवर्तित करने की आवश्यकता है
Classmethod से वापसी मान ()
classmethod()
विधि दिए गए फ़ंक्शन के लिए एक क्लास विधि देता है।
कक्षा विधि क्या है?
एक वर्ग विधि एक ऐसी विधि है जो अपनी वस्तु के बजाय एक वर्ग से जुड़ी होती है। यह एक वर्ग उदाहरण के निर्माण की आवश्यकता नहीं है, बहुत staticmethod की तरह।
स्थैतिक विधि और वर्ग विधि के बीच का अंतर है:
- स्टैटिक विधि कक्षा के बारे में कुछ नहीं जानती है और बस मापदंडों से संबंधित है
- क्लास विधि कक्षा के साथ काम करती है क्योंकि इसका पैरामीटर हमेशा क्लास ही होता है।
वर्ग विधि को कक्षा और उसकी वस्तु दोनों के द्वारा कहा जा सकता है।
Class.classmethod () या यहां तक कि कक्षा ()। classmethod ()
लेकिन कोई बात नहीं, वर्ग विधि हमेशा वर्ग के साथ पहले तर्क के रूप में एक वर्ग से जुड़ी होती है क्योंकि कक्षा स्वयं ही cls है।
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
एक व्यक्तिगत ऑब्जेक्ट बनाए बिना कॉल करते हैं जैसे कि हम स्टैटिक तरीकों के लिए करते हैं। यह वर्ग चर आयु को प्रिंट करता है।
आप कक्षा पद्धति का उपयोग कब करते हैं?
1. कारखाने के तरीके
फ़ैक्टरी विधियाँ वे विधियाँ हैं जो विभिन्न उपयोग के मामलों के लिए क्लास ऑब्जेक्ट (जैसे कंस्ट्रक्टर) को लौटाती हैं।
यह C ++ में कार्य करने के लिए समान है। चूंकि, पायथन में ऐसा कुछ नहीं है, इसलिए क्लास के तरीकों और स्टैटिक विधियों का उपयोग किया जाता है।
उदाहरण 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
विधि है।
कंस्ट्रक्टर सामान्य मापदंडों का नाम और आयु लेता है। जबकि, fromBirthYear
कक्षा, नाम और जन्मतिथि लेता है, वर्तमान वर्ष को वर्तमान वर्ष के साथ घटाकर वर्तमान आयु की गणना करता है और वर्ग उदाहरण देता है।
बर्थथाइअर विधि पहले पैरामीटर के रूप में व्यक्ति वर्ग (व्यक्ति वस्तु नहीं) को लेती है और निर्माणकर्ता को कॉल करके लौटा cls(name, date.today().year - birthYear)
देती है, जो कि इसके बराबर हैPerson(name, date.today().year - birthYear)
विधि से पहले, हम देखते हैं @classmethod
। इसे fromBirthYear
क्लास विधि के रूप में परिवर्तित करने के लिए डेकोरेटर कहा जाता है classmethod()
।
2. वंशानुक्रम में सही रचना निर्माण
जब भी आप किसी कारखाने विधि को एक वर्ग विधि के रूप में लागू करने से एक वर्ग प्राप्त करते हैं, तो यह व्युत्पन्न वर्ग का सही उदाहरण निर्माण सुनिश्चित करता है।
आप उपरोक्त उदाहरण के लिए एक स्थैतिक विधि बना सकते हैं, लेकिन जो वस्तु बनाता है, वह हमेशा बेस क्लास के रूप में हार्डकोड किया जाएगा।
लेकिन, जब आप एक वर्ग विधि का उपयोग करते हैं, तो यह व्युत्पन्न वर्ग का सही उदाहरण बनाता है।
उदाहरण 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 सुनिश्चित कर सकते हैं क्योंकि यह कक्षा के रूप में पहला पैरामीटर लेता है और अपने कारखाने विधि को कॉल करता है।