एक क्लास को एब्स्ट्रैक्ट क्लास कहा जाता है यदि इसमें एक या अधिक एब्स्ट्रैक्ट मेथड होते हैं। एक एब्स्ट्रैक्ट मेथड एक ऐसा मेथड है जो घोषित है, लेकिन इसमें कोई कार्यान्वयन नहीं है। एब्स्ट्रैक्ट क्लास को इंस्टेंटिएट नहीं किया जा सकता है, और इसके एब्स्ट्रैक्ट मेथड को इसके सबक्लास द्वारा लागू किया जाना चाहिए।
एब्स्ट्रैक्ट बेस क्लास इंटरफेस को परिभाषित करने का एक तरीका प्रदान करते हैं जब अन्य तकनीकें जैसे hasattr() अनाड़ी या सूक्ष्म रूप से गलत होंगी (उदाहरण के लिए मैजिक मेथड के साथ)। ABCs वर्चुअल सबक्लास पेश करते हैं, जो ऐसी क्लास हैं जो किसी क्लास से इनहेरिट नहीं करती हैं लेकिन फिर भी isinstance() और issubclass() फ़ंक्शन द्वारा पहचानी जाती हैं। Python में कई बिल्ट-इन ABCs हैं। Iterator, Generator, Set, Mapping आदि जैसे डेटा संरचनाओं के लिए ABCs collections.abc मॉड्यूल में परिभाषित हैं। numbers मॉड्यूल न्यूमेरिक टावर को परिभाषित करता है जो संख्यात्मक डेटा प्रकारों के लिए बेस क्लास का एक संग्रह है। Python लाइब्रेरी में 'abc' मॉड्यूल कस्टम एब्स्ट्रैक्ट बेस क्लास को परिभाषित करने के लिए बुनियादी ढांचा प्रदान करता है।
'abc' बेस क्लास के मेथड को एब्स्ट्रैक्ट के रूप में चिह्नित करके काम करता है। यह @abstractmethod डेकोरेटर द्वारा किया जाता है। एक ठोस क्लास जो इस तरह के एब्स्ट्रैक्ट बेस क्लास की सबक्लास है, फिर अपने एब्स्ट्रैक्ट मेथड को ओवरराइड करके एब्स्ट्रैक्ट बेस को लागू करती है।
abc मॉड्यूल ABCMeta क्लास को परिभाषित करता है जो एब्स्ट्रैक्ट बेस क्लास को परिभाषित करने के लिए एक मेटाक्लास है। निम्नलिखित उदाहरण ABCMeta का उपयोग करके Shape क्लास को एब्स्ट्रैक्ट बेस क्लास के रूप में परिभाषित करता है। Shape क्लास में area() मेथड abstractmethod द्वारा सजाया गया है।
एक Rectangle क्लास अब उपरोक्त Shape क्लास को अपने पैरेंट के रूप में उपयोग करती है और एब्स्ट्रैक्ट area() मेथड को लागू करती है। चूंकि यह एक ठोस क्लास है, इसे इंस्टेंटिएट किया जा सकता है और कार्यान्वित area() मेथड को बुलाया जा सकता है।
import abc
class Shape(metaclass=abc.ABCMeta):
@abc.abstractmethod
def area(self):
pass
class Rectangle(Shape):
def __init__(self, x, y):
self.l = x
self.b = y
def area(self):
return self.l * self.b
r = Rectangle(10, 20)
print('area:', r.area())
ध्यान दें कि एब्स्ट्रैक्ट बेस क्लास में एक से अधिक एब्स्ट्रैक्ट मेथड हो सकते हैं। चाइल्ड क्लास को उन सभी को लागू करना होगा, विफल होने पर TypeError उठाया जाएगा।
abc मॉड्यूल ABC हेल्पर क्लास भी परिभाषित करता है जिसे एब्स्ट्रैक्ट बेस क्लास की परिभाषा में ABCMeta क्लास के बजाय इस्तेमाल किया जा सकता है।
class Shape(abc.ABC):
@abc.abstractmethod
def area(self):
pass
एब्स्ट्रैक्ट बेस क्लास से सबक्लासिंग के बजाय, इसे रजिस्टर क्लास डेकोरेटर द्वारा एब्स्ट्रैक्ट बेस के रूप में पंजीकृत किया जा सकता है।
class Shape(abc.ABC):
@abc.abstractmethod
def area(self):
pass
@Shape.register
class Rectangle():
def __init__(self, x, y):
self.l = x
self.b = y
def area(self):
return self.l * self.b
आप एब्स्ट्रैक्ट बेस क्लास में @abstractclassmethod और @abstractstaticmethod मेथड डेकोरेटर द्वारा क्रमशः क्लास मेथड और स्टैटिक मेथड भी प्रदान कर सकते हैं।