जैसा कि अन्य उत्तरों में बताया गया है, हाँ आप abc
मॉड्यूल का उपयोग करके पायथन में अमूर्त कक्षाओं का उपयोग कर सकते हैं । नीचे मैं सार का उपयोग करके एक वास्तविक उदाहरण देता हूं @classmethod
, @property
और @abstractmethod
(पायथन 3.6+ का उपयोग करके)। मेरे लिए यह आम तौर पर उदाहरणों के साथ शुरू करना आसान है जिन्हें मैं आसानी से कॉपी और पेस्ट कर सकता हूं; मुझे उम्मीद है कि यह उत्तर दूसरों के लिए भी उपयोगी है।
आइए सबसे पहले एक बेस क्लास बनाएं जिसका नाम है Base
:
from abc import ABC, abstractmethod
class Base(ABC):
@classmethod
@abstractmethod
def from_dict(cls, d):
pass
@property
@abstractmethod
def prop1(self):
pass
@property
@abstractmethod
def prop2(self):
pass
@prop2.setter
@abstractmethod
def prop2(self, val):
pass
@abstractmethod
def do_stuff(self):
pass
हमारी Base
कक्षा में हमेशा एक from_dict
classmethod
, property
prop1
( एक जो केवल पढ़ा जाता है) और एक property
prop2
(जिसे सेट भी किया जा सकता है) और साथ ही एक फ़ंक्शन भी कहा जाता है do_stuff
। अब जो भी वर्ग के आधार पर बनाया गया है, Base
उसे इन सभी तरीकों / गुणों के लिए लागू करना होगा। कृपया ध्यान दें कि अमूर्त होने की विधि के लिए, दो सज्जाकारों की आवश्यकता होती है - classmethod
और सार property
।
अब हम A
इस तरह एक वर्ग बना सकते हैं :
class A(Base):
def __init__(self, name, val1, val2):
self.name = name
self.__val1 = val1
self._val2 = val2
@classmethod
def from_dict(cls, d):
name = d['name']
val1 = d['val1']
val2 = d['val2']
return cls(name, val1, val2)
@property
def prop1(self):
return self.__val1
@property
def prop2(self):
return self._val2
@prop2.setter
def prop2(self, value):
self._val2 = value
def do_stuff(self):
print('juhu!')
def i_am_not_abstract(self):
print('I can be customized')
सभी आवश्यक विधियों / गुणों को लागू किया गया है और हम कर सकते हैं - निश्चित रूप से - अतिरिक्त कार्यों को भी जोड़ सकते हैं जो Base
(यहाँ :) का हिस्सा नहीं हैं i_am_not_abstract
।
अब हम कर सकते हैं:
a1 = A('dummy', 10, 'stuff')
a2 = A.from_dict({'name': 'from_d', 'val1': 20, 'val2': 'stuff'})
a1.prop1
# prints 10
a1.prop2
# prints 'stuff'
इच्छानुसार, हम सेट नहीं कर सकते prop1
:
a.prop1 = 100
वापस होगा
विशेषता: विशेषता सेट नहीं कर सकता
इसके अलावा हमारी from_dict
विधि ठीक काम करती है:
a2.prop1
# prints 20
यदि हम अब B
इस तरह एक दूसरी श्रेणी को परिभाषित करते हैं :
class B(Base):
def __init__(self, name):
self.name = name
@property
def prop1(self):
return self.name
और इस तरह से एक वस्तु को पलटने की कोशिश की:
b = B('iwillfail')
हमें एक त्रुटि मिलेगी
TypeError: अमूर्त वर्ग B को अमूर्त विधियों do_stuff, from_dict, prop2 से नहीं रोक सकता
उन सभी चीजों को सूचीबद्ध करना, Base
जिनमें हमने लागू नहीं किया था B
।