سادگی زیباست...

بررسی انواع معماری های سیستم عامل و برنامه های سیستمی و روشهای توسعه آنها

سادگی زیباست...

بررسی انواع معماری های سیستم عامل و برنامه های سیستمی و روشهای توسعه آنها

سادگی زیباست...

۱ مطلب با کلمه‌ی کلیدی «python dynamic class loading» ثبت شده است

برای من شرایطی بوجود اومد که میخواستم یه برنامه بنویسم به عنوان یک پلتفرم عمل کنه و با استفاده از ماژولهای مختلف که به مرور براش نوشته میشه، یه عمل خاص رو بر روی داده ها انجام بده. مثلا فرض کنید میخواین برای چند نوع فایل متنی متفاوت، چند تا برنامه بنویسین که بیاد رو اونا پراسس انجام بده. شبیه عکس زیر در نظر بگیرین:

RawFile ----> main program ----if type 1 ---> plugin 1(file processing)-----|-->Output

                                       |_if type 2----> plugin 2(file processing)-----|

                                       |_if type 3----> plugin 3(file processing)-----|

                                                                ...

 یه راه سریع اینه که بیاین یه برنامه بنویسین و پلاگین ها رو جدا بنویسین، تو برنامه خودتون هم بیاین و همون پلاگین ها رو تعریف کنین و ساختار داده هاشون رو مقداردهی اولیه کنین. اونوقت، باید برای هر پلاگین جدید که نوشته میشه، یه تغییری تو کد خودتون بدین. این ساختار زیاد خوب نیست، چون تغییرات نیازمندی رو به برنامه اصلی خودتون هم اتصال میدین.

راهی که من استفاده کردم، اینه که یک سوپر کلاس تعریف کردم و تو اون ساختار کلی پلاگین های خودم رو تعریف کردم. مثلا پروپرتی ها و تابع های اصلی رو. یه فولدر تو پروژه خودم قرار دادم که همه پلاگین ها تو اون قرار بگیرن. برای اینکه اضافه کردن پلاگین نیازی به تغییر کد نداشته باشه، باید اولا کدم تمامی پلاگین ها رو اتوماتین لود میکرد و یه عضو ازش میساخت. هر پلاگین هم باید شرطی که نوع فایل مرتبط رو مشخص میکرد همراه با داده های شناسایی خودش به برنامه اصلی میگفت. تو کد من هر کلاس باید یه regex Pattern رو به عنوان الگو خودش به کد اصلی معرفی میکرد تا برنامه اصلی از طریق اون پلاگین مناسب رو انتخاب بکنه.

تو پایتون خیلی راحت میشه یه آرایه از کلاسها ایجاد کرد. فقط باید کلاسها مشخص بشه. برای اینکه بعدا فقط کد پلاگین ها ساخته بشه و هیچ تغییری لازم نباشه، اومدم از بارگذاری خودکار پلاگین ها که تو پایتون هست استفاده کردم.

import importlib, pkgutil, imp
plugins = {}
path = os.path.join(os.path.dirname(__file__),'Plugins')
modules = pkgutil.iter_modules(path=[path])
for loader,mod_name,ispkg in modules:
    if mod_name not in sys.modules:
        if mod_name.startswith('_'):
            mod = importlib.import_module("Plugins."+mod_name)
class_ = getattr(mod,mod_name) t=class_() Plugins[t.name]=t

اینجا برای مشخص شدن پلاگین ها از دیگه فایل ها من اومدم اول اسم فایل پلاگین ها یه "_" گذاشتم و تو شرط اون رو چک کردم.

در نهایت دیکشنری plugins یه کلید داره به اسم کلاس و محتویات اون یه شی از کلاس هست. من اینجا نمیخواستم از کلاس هر بار که لازمم میشه یه اینستنس جدا یسازم (تو پایتون هزینه هز اینستنس از کلاس خیلی زیاده).

۰ موافقین ۰ مخالفین ۰ ۰۱ دی ۹۳ ، ۲۲:۱۵
حامد شیخلو