खोज…


ABCMeta मेटाक्लस सेट करना

अमूर्त कक्षाएं वे कक्षाएं हैं जो विरासत में मिली हैं, लेकिन विशिष्ट विधियों को लागू करने से बचें, केवल विधि हस्ताक्षरों को पीछे छोड़ दें जो उपवर्गों को लागू करना होगा।

सार कक्षाएं उच्चतर स्तर पर क्लास एब्स्ट्रक्शन को परिभाषित करने और लागू करने के लिए उपयोगी हैं, टाइप किए गए भाषाओं में इंटरफेस की अवधारणा के समान, विधि कार्यान्वयन की आवश्यकता के बिना।

एक अमूर्त वर्ग को परिभाषित करने के लिए एक वैचारिक दृष्टिकोण वर्ग विधियों को बाहर करना है, और फिर एक्सेस होने पर NotImplementedError बढ़ाएं। यह बच्चों की कक्षाओं को पहले अभिभावक के बिना अभिभावक के तरीकों तक पहुँचने से रोकता है। इस तरह:

class Fruit:
    
    def check_ripeness(self):
        raise NotImplementedError("check_ripeness method not implemented!")


class Apple(Fruit):
    pass


a = Apple()
a.check_ripeness() # raises NotImplementedError

इस तरह से एक अमूर्त वर्ग का निर्माण उन तरीकों के अनुचित उपयोग को रोकता है जो अतिरंजित नहीं हैं, और निश्चित रूप से बाल कक्षाओं में परिभाषित किए जाने वाले तरीकों को प्रोत्साहित करते हैं, लेकिन यह उनकी परिभाषा को लागू नहीं करता है। abc मॉड्यूल के साथ हम बच्चे की कक्षाओं को तात्कालिक होने से रोक सकते हैं जब वे अपने माता-पिता और वंश के सार वर्ग के तरीकों को ओवरराइड करने में विफल होते हैं:

from abc import ABCMeta

class AbstractClass(object):
    # the metaclass attribute must always be set as a class variable 
    __metaclass__ = ABCMeta

   # the abstractmethod decorator registers this method as undefined
   @abstractmethod 
   def virtual_method_subclasses_must_define(self):
       # Can be left completely blank, or a base implementation can be provided
       # Note that ordinarily a blank interpretation implicitly returns `None`, 
       # but by registering, this behaviour is no longer enforced.

अब केवल उपवर्ग और ओवरराइड करना संभव है:

class Subclass(AbstractClass):
    def virtual_method_subclasses_must_define(self):
        return

ABCMeta और @abbridmethod का उपयोग क्यों / कैसे करें

एब्सट्रैक्ट बेस क्लास (एबीसी) लागू होते हैं जो व्युत्पन्न वर्ग बेस क्लास से विशेष तरीके लागू करते हैं।

यह समझने के लिए कि यह कैसे काम करता है और हमें इसका उपयोग क्यों करना चाहिए, आइए एक उदाहरण देखें कि वैन रोसुम आनंद लेगा। मान लीजिए कि हमारे पास दो तरीकों (मजाक और पंचलाइन) के साथ एक बेस क्लास "मोंटी पाइथन" है जो सभी व्युत्पन्न वर्गों द्वारा लागू किया जाना चाहिए।

class MontyPython:
    def joke(self):
        raise NotImplementedError()

    def punchline(self):
        raise NotImplementedError()

class ArgumentClinic(MontyPython):
    def joke(self):
        return "Hahahahahah"

जब हम किसी वस्तु को त्वरित करते हैं और इसे दो तरीके कहते हैं, तो हमें punchline() विधि से एक त्रुटि मिलेगी (जैसा कि अपेक्षित है)।

 >>> sketch = ArgumentClinic() 
 >>> sketch.punchline() 
NotImplementedError 

हालांकि, यह अभी भी हमें त्रुटि प्राप्त किए बिना ArgumentClinic वर्ग की एक वस्तु को तत्काल अनुमति देता है। वास्तव में हमें एक त्रुटि नहीं मिलती है जब तक हम पंचलाइन () की तलाश नहीं करते हैं।

एब्सट्रैक्ट बेस क्लास (एबीसी) मॉड्यूल का उपयोग करके इसे टाला जाता है। आइए देखें कि यह एक ही उदाहरण के साथ कैसे काम करता है:

from abc import ABCMeta, abstractmethod

class MontyPython(metaclass=ABCMeta):
    @abstractmethod
    def joke(self):
        pass

@abstractmethod
def punchline(self):
    pass

class ArgumentClinic(MontyPython):
    def joke(self):
        return "Hahahahahah"

इस बार जब हम अधूरे वर्ग से किसी वस्तु को तुरंत हटाने की कोशिश करते हैं, तो हमें तुरंत एक टाइपर्रर मिल जाता है!

>>> c = ArgumentClinic()
TypeError:
"Can't instantiate abstract class ArgumentClinic with abstract methods punchline"

इस मामले में, किसी भी प्रकार से बचने के लिए कक्षा को पूरा करना आसान है:

class ArgumentClinic(MontyPython):
    def joke(self):
        return "Hahahahahah"

    def punchline(self):
        return "Send in the constable!"

इस बार जब आप किसी वस्तु को काम करते हैं, तो उसे तुरंत हटा देते हैं!



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow