অন্যান্য উত্তরে যেমন ব্যাখ্যা করা হয়েছে, হ্যাঁ আপনি 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')
আমরা একটি ত্রুটি পেতে হবে
প্রকারের ত্রুটি: বিমূর্ত পদ্ধতি do_stuff, from_dict, prop2 দিয়ে বিমূর্ত শ্রেণি বি ইনস্ট্যান্ট করতে পারে না
সংজ্ঞায়িত সমস্ত বিষয় তালিকাভুক্ত করা হচ্ছে Base
যা আমরা প্রয়োগ করি নি B
।