tgoop.com/djangolearn_ir/1105
Create:
Last Update:
Last Update:
درمورد Descriptor چی می دونیم؟
چطوری میتوان رفتارهای ویژگیهای مرتبط به یک کلاس را مدیریت کرد؟ چطوری میتوانیم کاری کنیم که ویژگیهای متفاوت کلاسهای مختلف به شکلی یکسان مدیریت شوند؟
ما در حالت ساده هیچ کنترلی روی ویژگی (Attribute) هایی که یک کلاس دارد نداریم.
وقتی شما کلاسی دارید که یک ویژگی به نام x دارد، هنگام کار با نمونههای ساختهشده از این کلاس میتوان هر مقداری را به این ویژگی نسبت داد.
مثلاً فرضکنید که ما یک کلاس به نام Person داریم که مقدار سن شخص در آن نگهداری میشود:
class Person:
def __init__(self, age):
self.age = age
حالا ما موقع ساخت یک نمونه از این کلاس میتوانیم «هرچیزی» را به آن نسبت بدهیم:
person1 = Person(10000)
person2 = Person(-10)
person3 = Person("I am not even an integer!")
در حالت ساده ما هیچ کنترلی روی ویژگیها نداریم. پس تمام نمونههای بالا از نظر زبان پایتون درست هستند. امّا این مقادیر منطق برنامهی ما را خراب میکنند.
شما میتوانید برای اعتبارسنجی (Validation) مقادیر کدهای اضافیای را درون init قرار بدهید. امّا آن کدها دیگر تغییرات مقادیر را پس از ساخت شئ کنترل نمیکنند.
حتّی میتوانید متدهایی برای اعتبارسنجی درون کلاستان بگذارید. امّا این کار تنها استفاده از کدتان را برای دیگران سختتر میکند و همواره این احتمال وجود دارد که برنامهنویس فراموش کند که پس از هرتغییری در هر جای کد، آن متدها را فراخوانی کند.
از این مورد بگذریم.
فرضکنید که شما میخواهید یک ویژگی درون کلاس A همیشه عدد مثبت باشد. حالا در جای دیگر برنامه نیازدارید که چند ویژگی کلاس B هم درست همین خاصیّت را داشته باشند.
کلاسهای A و B هم هیچ ربط منطقیای ندارند و نمیتوان به مواردی مثل ارثبری حتّی فکر کرد.
عالی نبود اگر میشد کاری کرد که ویژگیهای کلاس های مختلف، بدون اینکه به هم ربطی پیدا کنند، به یک شکل مدیریت شوند؟
خب Descriptor پروتکلی است که همهی این کارها را برای ما میکند.
پروتکل Descriptor خیلی ساده است. هر کلاسی که حداقل یکی از متدهای: set، get یا delete را پیادهسازی کند یک Descriptor حساب میشود.
کاربردها و مثال های Descriptor رو خودتون بخونید.
از سایت علی حسینی کپی کردم. این لینک
میخوام یه قابلیت ساده که توی جنگو هست رو توضیح بدم.
اما قبلش اگه بدونیم Descriptor چیه، یادگرفتنش باحال تر میشه.
پس اگه عمری بود، بقیه در پست های بعدی...
اسپانسر این قسمت 👈 لینک
BY جنگولرن
Share with your friend now:
tgoop.com/djangolearn_ir/1105
