زبان پایتان مثل بسیاری دیگه از زبان ها از شئ گرایی پشتیبانی میکنه. تقریبا هر چیزی تو پایتان یک Object حساب میشه. هر چند که در مقایسه با زبان هایی مثل Java این شی گرایی اون قدرا هم ملموس نیست. تو این مقاله میخایم به بررسی تفاوت ها و شباهت های شئ گرایی در پایتان و جاوا بپردازیم. به صورت کلی OOP در پایتان ساده و سبک تره. این اصلا به معنی بی دقت بودن پایتان نیست بلکه به معنی هوشمند تر بودن پایتانه.
منظور از OOP (Object Oriented Programming) همون شئ گرایی هست.
تو زبان جاوا اسم فایلی که کلاس در اون اعلان شده باید با اسم کلاس یکی باشه. ولی تو پایتان اصلا لزومی نداره این طوری باشه. مثلا تو کد زیر کلاس Car رو داخل فایلی به اسم carclass.py ذخیره کردیم.
# carclass.py class Car: def __init__(self, color): self.color = color
و به این صورت هم ازش تو فایل های دیگه استفاده می کنیم:
# test.py import carclass my_car = carclass.Car("red") print(my_car.color)
حواست باشه که اسم فایل ات برابر با اسم کتاب خونه های خود پایتان نباشه مثلا اسم فایل ات رو نذار math چون math اسم یکی از کتاب خونه های اصلی خود پایتانه.
بر خلاف جاوا که اسم متد سازنده هر کلاسی برابر با اسم کلاسش هست توی پایتان متد __init__ رو داریم که همون کار رو انجام میده.
class Car: def __init__(self, color): self.color = color
همون طوری که تا الان متوجه شدی دیگه مثل جاوا کلید واژه هایی مثل public و private و static و امثالهم رو نداریم توی پایتان. البته پایتان استراتژی های خاص خودش رو برای private کردن یا static کردن داره که در ادامه بررسی می کنیم.
بر خلاف جاوا که Attribute ها (اسامی دیگه ای هم دارن مثل field, property و ...) رو داخل خود کلاس اعلان می کردیم و باید سطح دسترسی و جنس و ایناشون رو هم مشخص می کردیم پایتان در این مورد خیلی راحت تر می اندیشه! خیلی راحت. توی همون متد __init__ هر چیزی رو که مقدار دادی بهش انگاری اعلانش هم کردی!
class Car: def __init__(self, color, brand): self.color = color self.brand = brand
همون طوری که دیدی به جای کلید واژه this که تو جاوا داشتیم این جا self رو داریم. البته فرقی نداره اسمش رو چی بذاری حتی میتونی همون this هم بذاری. مهم اینه که اولین پارامتر متد هات باشه.
تو جاوا این قدر کلیدواژه های اضافی بود که آدم گیج میشد. مثلا واسه یک فایل hello world ساده باید public static void main راه مینداختیم! تو رو خدا یادته؟! این جا تو پایتان اگه لازم می بینی یک attribute ای static باشه فقط کافیه خارج از __init__ اعلانش کنی و بهش مقدار بدی! تموم شد رفت!
class Car: a_static_attribute = 5 def __init__(self, brand): self.brand = brand
و نکته جالب این جاست که برای هر object ای که از روی کلاسش ساختی می تونی مقدار static attribute ها رو عوض کنی.
این امکان در پایتان وجود داره که بعد از نمونه برداری object از روی کلاس متناظرش، بهش attribute ها مختص همون object رو اضافه کنی. یعنی بدون این که توی کلاس این attribute ها اصلا پیش بینی شده باشن!
class Car: def __init__(self, brand): self.brand = brand my_car = Car("Benz") my_car.production = 2002
اگه دوست داری یک attribute یا یک method خصوصی (private) داشته باشی (یعنی این که فقط داخل همون کلاس بشه ازش استفاده کرد) نیازی به کلیدواژه های private نیست! کافیه قبل اسمشون __ بیاری (double underscore):
class Car: def __init__(self, color, brand): self.color = color self.brand = brand self.__serial = 3467
البته پایتان چون مهربون عه یک تکنیکی درست کرده که باز هم بشه به اعضای private دسترسی داشت به اسم name mangling. می تونی در خصوصش مطالعه کنی.
تو پایتان چون به سخت گیری Java کار نمی کنیم اگه واقعا بخایم یک عضوی از کلاس رو protected کنیم باید از property decorator استفاده کنیم. ولی به عنوان یک رسم (به این چیزا میگن convention یعنی رسمی که جا افتاده باشه) می تونیم اعضایی که توقع داریم به صورت protected در نظرشون بگیریم رو قبل اسمشون یک underscore قرار بدیم. (هر چند که با این کار واقعا protected نمیشن)
تو این مقاله اصلی ترین تفاوت ها و شباهات های OOP در پایتان و جاوا رو بررسی کردیم. هر وقت صحبت از شی گرایی میشه Java حرف اول رو میزنه. در مقایسه، پایتان به صورت هوشمندانه تری تونسته OOP رو پیاده سازی کنه. تو پایتان خبری از کلیدواژه هایی مثل public, private, protected نیست. به طور کلی میشه گفت:
شئ گرایی در پایتان انعطاف پذیر تر، راحت تر و هوشمندانه تره.