অ্যাবস্ট্রাক্ট বেস ক্লাসগুলির সাথে ইন্টারফেস প্রয়োগ করা আধুনিক পাইথন 3 এ অনেক সহজ এবং তারা প্লাগ-ইন এক্সটেনশনের ইন্টারফেস চুক্তি হিসাবে একটি উদ্দেশ্য পরিবেশন করে।
ইন্টারফেস / বিমূর্ত বেস শ্রেণি তৈরি করুন:
from abc import ABC, abstractmethod
class AccountingSystem(ABC):
@abstractmethod
def create_purchase_invoice(self, purchase):
pass
@abstractmethod
def create_sale_invoice(self, sale):
log.debug('Creating sale invoice', sale)
একটি সাধারণ সাবক্লাস তৈরি করুন এবং সমস্ত বিমূর্ত পদ্ধতি ওভাররাইড করুন:
class GizmoAccountingSystem(AccountingSystem):
def create_purchase_invoice(self, purchase):
submit_to_gizmo_purchase_service(purchase)
def create_sale_invoice(self, sale):
super().create_sale_invoice(sale)
submit_to_gizmo_sale_service(sale)
উপরের মতো সাবক্লাসে সুস্পষ্টভাবে create_sale_invoice()এটিকে কল করে আপনার পছন্দ মতো বিমূর্ত পদ্ধতিতে সাধারণ প্রয়োগ হতে পারে super()।
একটি সাবক্লাস ইনস্ট্যান্টেশন যা সমস্ত বিমূর্ত পদ্ধতি প্রয়োগ করে না:
class IncompleteAccountingSystem(AccountingSystem):
pass
>>> accounting = IncompleteAccountingSystem()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class IncompleteAccountingSystem with abstract methods
create_purchase_invoice, create_sale_invoice
আপনার সাথে আনুষাঙ্গিক বৈশিষ্ট্যগুলি, স্থিতিশীল এবং শ্রেণি পদ্ধতিগুলির সাথে সম্পর্কিত এনোটেশনগুলি সংযুক্ত করেও থাকতে পারে @abstractmethod ।
প্লাগ-ভিত্তিক সিস্টেমগুলি বাস্তবায়নের জন্য অ্যাবস্ট্রাক্ট বেস ক্লাসগুলি দুর্দান্ত। কোনও শ্রেণীর সমস্ত আমদানিকৃত সাবক্লাসগুলি এই মাধ্যমে অ্যাক্সেসযোগ্য __subclasses__(), সুতরাং আপনি যদি কোনও প্লাগইন ডিরেক্টরি থেকে সমস্ত ক্লাস লোড করেন importlib.import_module()এবং যদি তারা বেস বর্গটি সাবক্লাস করেন তবে আপনার মাধ্যমে সেগুলিতে সরাসরি অ্যাক্সেস রয়েছে __subclasses__()এবং আপনি নিশ্চিত হতে পারেন যে ইন্টারফেস চুক্তিটি সকলের জন্য প্রয়োগ করা হয়েছে sure তাত্ক্ষণিক সময় তাদের।
AccountingSystemউপরের উদাহরণের জন্য এখানে প্লাগইন লোডিং বাস্তবায়ন রয়েছে :
...
from importlib import import_module
class AccountingSystem(ABC):
...
_instance = None
@classmethod
def instance(cls):
if not cls._instance:
module_name = settings.ACCOUNTING_SYSTEM_MODULE_NAME
import_module(module_name)
subclasses = cls.__subclasses__()
if len(subclasses) > 1:
raise InvalidAccountingSystemError('More than one '
f'accounting module: {subclasses}')
if not subclasses or module_name not in str(subclasses[0]):
raise InvalidAccountingSystemError('Accounting module '
f'{module_name} does not exist or does not '
'subclass AccountingSystem')
cls._instance = subclasses[0]()
return cls._instance
তারপরে আপনি AccountingSystemক্লাসের মাধ্যমে অ্যাকাউন্টিং সিস্টেম প্লাগইন অবজেক্টটি অ্যাক্সেস করতে পারবেন :
>>> accountingsystem = AccountingSystem.instance()
( এই পাইমোটডব্লু -3 পোস্ট দ্বারা অনুপ্রাণিত ।)