دام های متغیر کلاس در مقابل نمونه
دام های متغیر کلاس در مقابل نمونه
علاوه بر ایجاد تمایز بین متدهای کلاس و نمونه متغیرهای نمونه روشها، مدل شی پایتون نیز بین کلاس و این یک تمایز مهم است، اما همچنین باعث دردسر من شد به عنوان یک توسعه دهنده جدید پایتون. برای مدت طولانی من زمان را سرمایه گذاری نکردم آزمایشات اولیه OOP مملو از رفتارهای شگفت انگیز بود نیاز به درک این مفاهیم از پایه است. و بنابراین من اشکالات عجیب و غریب در این فصل ما هر گونه سردرگمی طولانی در مورد آن را برطرف خواهیم کرد همانطور که گفتم، دو نوع ویژگی داده در اشیاء پایتون وجود دارد: متغیرهای کلاس و متغیرهای نمونه این موضوع با چند مثال عملی متغیرهای کلاس در داخل تعریف کلاس اعلان می شوند (اما خارج از یک کلاس در عوض، متغیرهای کلاس محتویات خود را در کلاس ذخیره می کنند خود، و تمام اشیاء ایجاد شده از یک کلاس خاص به اشتراک دسترسی دارند مجموعه یکسانی از متغیرهای کلاس این به این معنی است که مثلاً اصلاح کردن یک متغیر کلاس بر تمام نمونه های شی به طور همزمان تأثیر می گذارد.
متغیرهای نمونه همیشه به یک نمونه شی خاص گره خورده اند.
محتویات آنها در کلاس ذخیره نمی شود، بلکه در هر شیء منفرد ایجاد شده از کلاس ذخیره می شود. بنابراین، محتویات یک متغیر نمونه کاملاً مستقل از یک نمونه شی به نمونه دیگر است. و بنابراین، تغییر یک متغیر نمونه تنها بر یک نمونه شی تأثیر می گذارد در یک زمان. از هر روش نمونه). آنها به هیچ نمونه خاصی وابسته نیستند بسیار خوب، این نسبتاً انتزاعی بود – وقت آن است که به کدی نگاه کنیم! بیایید شکست بخوریم از ماشین ها یا حیوانات خانگی برای نشان دادن نظر خود استفاده کنید، و شکستن آن سخت است آن سنت از “مثال سگ” قدیمی… بنا به دلایلی، همیشه آموزش های OOP یک سگ شاد به چه چیزی نیاز دارد؟ چهار پا و یک نام:num_legs = 4 # <- Class variable def __init__(self, name): class Dog: self.name = name # <- Instance variableبسیار خوب، این یک نمایش شی گرا از وضعیت سگی است که من توضیح دادم. ایجاد نمونه های جدید Dog همانطور که انتظار می رود کار می کند، و هر کدام یک متغیر نمونه به نام name دریافت می کنند:>>> jill = Dog(‘Jill’) >>> jack = Dog(‘Jack’) >>> jack.name, jill.name (‘Jack’, ‘Jill’)در مورد متغیرهای کلاس کمی انعطاف پذیری بیشتری وجود دارد. شما می تواند به متغیر کلاس num_legs مستقیماً روی هر سگ در حالت یا در خود کلاس دسترسی داشته باشد:(4, 4) >>> jack.num_legs, jill.num_legs >>> Dog.num_legs 4با این حال، اگر سعی کنید از طریق کلاس به یک متغیر نمونه دسترسی پیدا کنید، با یک AttributeError شکست خواهد خورد. متغیرهای نمونه خاص هستند اجرا می شود – آنها حتی در خود کلاس وجود ندارند. هر نمونه شی و زمانی که سازنده init ایجاد می شود این تمایز اصلی بین متغیرهای کلاس و نمونه است:AttributeError: >>> Dog.name “type object ‘Dog’ has no attribute ‘name'”
قوانین ارسال دیدگاه در سایت