ارجاعات ضعیف در پایتون - قسمت اول

ماژول weakref به برنامه نویسان پایتون اجازه می دهدتا ارجاعات ضعیف به اشیا را بسازند.
واژه شناسی :
واژه ی referent(مرجوع) به معنای شی ای است که توسط ارجاع ضعیف مورد اشاره قرار گرفته است.

ارجاع ضعیف به یک شی برای زنده نگه داشتن یک شی کافی نیست.وقتی که تنها ارجاع باقی مانده یک ارجاع ضعیف باشد،garbage collection(زباله روب) شروع به نابودی مرجوع(referent) و آزاد کردن حافظه برای استفاده های آتی می کند.به هر حال تا زمانی که شی نابود نشده است،با استفاده از ارجاع ضعیف شی برگشت داده می شود حتی اگر ارجاعی قوی به آن وجود نداشته باشد.
یکی از موارد استفاده از ارجاعات ضعیف، پیاده سازی کش ها(caches) یا نگاشت(map) اشیا بزرگ است.اینجاست که به دلیل حضور در کش یا نگاشت، اشیا بزرگ به تنهایی زنده نمی مانند.
برای مثال اگر تعدادی اشیا بزرگ دودویی از نوع تصویر را داشته باشیم،ممکن است که بخواهیم به همراه هر شی نام آن نیز قرار گیرد.اگریک دیکشنری پایتونی برای نگاشت نام ها به عکس ها یا عکس ها به نام ها استفاده کرده باشید،اشیا تصویری به دلیل آنکه به صورت کلید یا مقدار ذخیره می شوند، زنده می مانند.کلاس های WeakKeyDictionary و WeakValueDictionary به عنوان یک آلترناتیو توسط ماژول weakref به کار برده می شوند.این کلاس ها از ارجاعات ضعیف برای ساخت نگاشت هایی که در آن ها اشیا به تنهایی زنده نمی مانند،استفاده می شوند.
برای مثال اگر یک شی عکس، مقداری در WeakValueDictionary باشد دراین صورت اگر آخرین ارجاع به شی عکس در نگاشت ضعیفِ، ارجاعات ضعیف باشند، زباله روب می تواند شی را بازیافت نماید و مدخل متناسب با آن در نگاشت ضعیف به سادگی حذف خواهد شد.
WeakKeyDictionary و WeakValueDictionary از ارجاعات ضعیف در پیاده سازی خود استفاده می کنند.این دو توابع کال بک را بر روی ارجاعات ضعیف تنظیم می کنند تا زمانی که زباله روب یک کلید یا مقدار را بازیافت کرد،عملی انجام گیرد.
به طریق مشابه WeakSet واسط set را پیاده سازی می کند اما به مانند WeakKeyDictionary از ارجاعات ضعیف استفاده می کند.
متد finalize یک روش سرراست را برای ثبت یک تابع فراهم می آورد تا وقتی که یک شی توسط زباله روب بازیافت شود این تابع فراخوانی شود.
به تمامی اشیا نمی توان به صورت ضعیف ارجاع داشت.به موارد زیر می توان ارجاع ضعیف داشت:

class instances
functions written in python(but not in C)
instance methods
sets
frozensets
some file objects
generators
type objects
sockets
arrays
deques
regex objects
code objects

تغییرات نسخه ۳.۲: پشتیبانی از thread.lockو threading.Lock و code objects اضافه شده است.

برخی انواع توکار مانند  list و dict به طور مستقیم از ارجاعات ضعیف پشتیبانی نمی کنند اما می توان این پشتیبانی را به زیرکلاس ها افزود.

class Dict(dict):
    pass
obj = Dict(red=1, green=2, blue=3)   # this object is weak refrenceable


دیگر انواع توکار مانند tuple و int حتی اگر زیر کلاسی از آن ها ساخته شود،ارجاعات ضعیف را پشتیبانی نمی کنند.(البته این موضوع تنها برای CPython صادق است دیگر پیاده سازی های پایتون مانند Jython و IronPython ممکن است که فرق کنند)

نکته:CPython پایتون با ماشین مجازی سی ،‌Jython پایتون با ماشین مجازی جاوا و IronPython پایتون بر بستر NET.است.

قسمت دوم..

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی
طراح قالب : عرفـــ ـــان قدرت گرفته از بلاگ بیان