اگر نام ویژگی یکسانی هم در یک نمونه و هم در یک کلاس وجود داشته باشد، جستجوی ویژگی اولویت نمونه را دارد.
ویژگیهای داده میتوانند توسط متدها و همچنین کاربران عادی ("مشتریان") یک شیء مرجع داده شوند. به عبارت دیگر، کلاسها برای پیادهسازی انواع داده انتزاعی محض قابل استفاده نیستند. در واقع، هیچ چیز در پایتون امکان اعمال مخفیکاری داده را فراهم نمیکند — همه چیز بر اساس قرارداد است.
مشتریان باید در استفاده از ویژگیهای داده محتاط باشند — مشتریان میتوانند ثباتهایی را که توسط متدها حفظ میشوند با نوشتن روی ویژگیهای دادهشان خراب کنند. توجه کنید که مشتریان میتوانند ویژگیهای داده خودشان را به یک شیء نمونه اضافه کنند بدون اینکه اعتبار متدها را تحت تأثیر قرار دهند، تا زمانی که از تداخل نامها جلوگیری شود.
هیچ میانبری برای مراجع به ویژگیهای داده (یا متدهای دیگر!) از داخل متدها وجود ندارد. این در واقع خوانایی متدها را افزایش میدهد: هیچ شانسی برای اشتباه گرفتن متغیرهای محلی و متغیرهای نمونه هنگام مرور یک متد وجود ندارد.
اغلب، آرگومان اول یک متد self نامیده میشود. این فقط یک قرارداد است: نام self هیچ معنای خاصی برای پایتون ندارد. اما توجه کنید که با پیروی نکردن از قرارداد، کد شما برای سایر برنامهنویسان پایتون کمتر خوانا میشود و قابل تصور است که یک برنامه مرورگر کلاس نوشته شود که به چنین قراردادی تکیه کند.
هر شیء تابعی که ویژگی کلاس باشد، متدی برای نمونههای آن کلاس تعریف میکند. لازم نیست تعریف تابع در متن درون تعریف کلاس محصور شده باشد: اختصاص یک شیء تابع به یک متغیر محلی در کلاس نیز ok است.
متدها میتوانند متدهای دیگر را با استفاده از ویژگیهای متد آرگومان self فراخوانی کنند:
class Bag:
def __init__(self):
self.data = []
def add(self, x):
self.data.append(x)
def addtwice(self, x):
self.add(x)
self.add(x)
متدها میتوانند به نامهای سراسری به همان شکل توابع عادی ارجاع دهند. دامنه سراسری مرتبط با یک متد ماژول حاوی تعریف آن است. (یک کلاس هرگز به عنوان دامنه سراسری استفاده نمیشود.) در حالی که به ندرت دلیل خوبی برای استفاده از داده سراسری در یک متد دیده میشود، کاربردهای مشروع زیادی برای دامنه سراسری وجود دارد: برای یک چیز، توابع و ماژولهای وارد شده در دامنه سراسری میتوانند توسط متدها و همچنین توابع و کلاسهای تعریف شده در آن استفاده شوند. معمولاً، کلاس حاوی متد خودش در این دامنه سراسری تعریف شده و در بخش بعدی دلایل خوبی خواهیم یافت که چرا یک متد میخواهد به کلاس خودش ارجاع دهد.
هر مقدار یک شیء است و بنابراین یک کلاس (همچنین به عنوان نوع آن شناخته میشود) دارد. به صورت object.__class__ ذخیره میشود.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://docs.python.org/3/tutorial