یک مثال بدون سگ
در حالی که هیچ سگی در ساخت این فصل آسیب ندیده است (همه چیز سرگرم کننده است و بازی تا زمانی که کسی جوانه بزند و یک جفت پا اضافی)، من می خواستم یک مثال عملی دیگر از کارهای مفیدی که می توانید انجام دهید به شما ارائه دهد برنامه های کاربردی برای متغیرهای کلاس با متغیرهای کلاس چیزی که کمی به دنیای واقعی نزدیکتر است پس اینجاست. کلاس CountedObject زیر چگونگی را پیگیری می کند ممکن است در واقع یک معیار عملکرد جالب برای دانستن باشد):class CountedObject: بارها در طول عمر یک برنامه نمونه سازی شد (که def __init__(self): num_instances = 0 self.__class__.num_instances += 1CountedObject یک متغیر کلاس num_instances را نگه می دارد که به عنوان کار می کند یک پیشخوان مشترک وقتی کلاس اعلام شد، شمارنده را مقداردهی اولیه می کند هر بار که یک نمونه جدید از این کلاس ایجاد می کنید، مقدار آن را افزایش می دهد هنگامی که سازنده init اجرا می شود، شمارنده به اشتراک گذاشته می شود:>>> CountedObject.num_instances به صفر می رسد و سپس آن را به حال خود رها می کند. >>> CountedObject().num_instances 1 >>> CountedObject().num_instances 2 >>> CountedObject().num_instances 3 >>> CountedObject.num_instances 3توجه کنید که چگونه این کد باید از یک حلقه کوچک عبور کند تا مطمئن شود متغیر شمارنده را در کلاس افزایش می دهد. این می شد 0 اگر سازنده را به صورت زیر می نوشتم به راحتی می توان مرتکب آن شد:class BuggyCountedObject: # WARNING: This implementation contains a bug def __init__(self): num_instances = 0 self.num_instances += 1 # !!!همانطور که خواهید دید، این پیاده سازی (بد) هرگز اشتراک گذاری را افزایش نمی دهد متغیر شمارنده:0 >>> BuggyCountedObject.num_instances >>> BuggyCountedObject().num_instances >>> BuggyCountedObject().num_instances 1 >>> BuggyCountedObject().num_instances 1 >>> BuggyCountedObject.num_instances 0من مطمئن هستم که اکنون می توانید ببینید کجا اشتباه کردم. این پیادهسازی (باگی) هرگز شمارنده مشترک را افزایش نمیدهد زیرا من ساختهام اشتباهی که قبلا در مثال “جک سگ” توضیح دادم. این 1 پیاده سازی کار نمی کند زیرا من به طور تصادفی “سایه” کردم همین نام در سازنده متغیر کلاس num_instance با ایجاد یک متغیر نمونه از مقدار جدید شمارنده را به درستی محاسبه می کند (از 0 به 1 می رود) اما سپس نتیجه را در یک متغیر نمونه ذخیره می کند – که به معنای دیگر است نمونه های کلاس هرگز حتی مقدار شمارنده به روز شده را نمی بینند. همانطور که می بینید، این یک اشتباه کاملاً آسان است. ایده خوبی است که مراقب باشید و در هنگام برخورد با موارد اشتراکی محدوده خود را دوباره بررسی کنید وضعیت در یک کلاس تستهای خودکار و بررسیهای همتا کمک زیادی به این کار میکنند با این وجود، امیدوارم بتوانید دلیل و چگونگی متغیرهای کلاس را ببینید مشکلات آنها – می توانند در عمل ابزارهای مفیدی باشند. موفق باشید!که
قوانین ارسال دیدگاه در سایت