برنامه نویسی شی گرا (OOP) سبکی از برنامه نویسی است که به شدت متکی است روی اشیاء. این اشیا می توانند ویژگی ها و متدهایی داشته باشند. در حالی که ویژگی ها داده ها را ذخیره می کنند، روش ها رفتار را تعریف می کنند.

مانند بسیاری از زبان های برنامه نویسی دیگر، پایتون هم از برنامه نویسی OOP و هم از برنامه نویسی تابعی پشتیبانی می کند. با این حال، OOP هنگام نوشتن برنامه های بزرگ و پیچیده ارزشمند می شود.

در این مقاله با مزایای OOP در پایتون، روش تعریف کلاس، ویژگی های کلاس و نمونه و متدهای نمونه آشنا خواهید شد. همچنین با مفهوم کپسوله سازی و روش پیاده سازی وراثت بین کلاس ها در پایتون آشنا خواهید شد.

برای درک کامل این مقاله، باید پیش نیازهای زیر را داشته باشید:

  • دانش اولیه زبان برنامه نویسی پایتون.
  • آشنایی با مفاهیم توابع و اشیا در برنامه نویسی.
  • تجربه کار با ویرایشگر کد یا محیط توسعه یکپارچه (IDE).
  • درک اولیه روش استفاده از a command-line terminal یا console.

حالا بیایید شیرجه بزنیم.

چرا از برنامه نویسی شی گرا استفاده کنیم؟

برنامه نویسی شی گرا (OOP) مزایای متعددی را هنگام سازماندهی و مدیریت کد ارائه می دهد. با گروه‌بندی داده‌ها و توابع مرتبط در کلاس‌های منطقی، OOP ساختار کد را ارتقا می‌دهد و تعمیر و نگهداری را ساده می‌کند، به‌ویژه زمانی که برنامه‌ها در اندازه و پیچیدگی رشد می‌کنند. رویکرد ماژولار درک، اصلاح و استفاده مجدد از کد را آسان‌تر می‌کند و در نتیجه زمان توسعه را کاهش می‌دهد.

یکی دیگر از مزایای OOP توانایی آن در ارائه یک سبک برنامه نویسی واضح و مرتبط است که می تواند برای توسعه دهندگان مفیدتر باشد. استفاده از اشیا و روابط بین آنها مفاهیم دنیای واقعی را منعکس می کند. این امر استدلال در مورد کد و طراحی سیستم های پیچیده را آسان تر می کند.

در نهایت، مفاهیم OOP مانند کپسوله‌سازی و وراثت، با ترویج حفاظت از داده‌ها و قابلیت استفاده مجدد کد، به استحکام کد کمک می‌کنند.

کلاس در پایتون چیست؟

OOP در پایتون به شدت متکی است روی مفهومی از class. شما می توانید یک کلاس را به عنوان یک طرح اولیه در نظر بگیرید که برای ایجاد اشیا استفاده می شود. برای نشان دادن این موضوع، تصور کنید که طرحی برای یک بلندگو دارید. شما می توانید از این طرح برای ساخت چندین بلندگو استفاده کنید. هر بلندگوی که با استفاده از طرح اولیه ایجاد می شود، نمونه ای از طرح اولیه است. همچنین هر بلندگوی ایجاد شده دارای ویژگی هایی مانند رنگ، مدل و نام است. آنها همچنین روش های خود را نشان می دهند که نوع خاصی از رفتار مانند افزایش صدا و کاهش صدا را نشان می دهد.

روش تعریف کلاس در پایتون

برای تعریف یک کلاس، باید از آن استفاده کنید class کلمه کلیدی که توسط پایتون ارائه می شود، سپس نام کلاس و یک کولون به دنبال آن آمده است:

class ClassName:
    pass

اکنون با استفاده از تصویر قبلی خود، بیایید کلاسی به نام ایجاد کنیم Speaker. در ویرایشگر کد خود، یک فایل به نام ایجاد کنید classes.py و خطوط کد زیر را در آن کپی کنید:

class Speaker:
    pass

speaker_one = Speaker()
print(speaker_one)

در کد قبلی، کلاسی به نام تعریف کردید Speaker بدون هیچ ویژگی یا روش شما از کلمه کلیدی استفاده کردید pass در بدنه کلاس در پایتون، pass کلمه کلیدی هیچ کاری انجام نمی دهد و معمولاً به عنوان مکان نگهدارنده استفاده می شود.

در خط چهار کد، یک نمونه از کد ایجاد کردید Speaker کلاس و آن را به متغیر اختصاص داد speaker_one. این process همچنین به عنوان نمونه سازی یک شی از یک کلاس شناخته می شود. بعد چاپ کردی speaker_one در خط پنج

حالا با اجرای دستور کد را اجرا کنید python classes.py در شما terminal. خروجی مشابه این را در خود دریافت خواهید کرد terminal:

<__main__.Speaker object at 0x10087f8e0>

خروجی این را نشان می دهد speaker_one یک شی است. 0x10087f8e0 در خروجی آدرس حافظه را نشان می دهد که پایتون شی را در آن ذخیره می کند روی کامپیوتر شما.

آدرس حافظه موجود در شما terminal خروجی متفاوت خواهد بود.

شما می توانید چندین نمونه دیگر از آن ایجاد کنید Speaker کلاس و همه آنها با یکدیگر متفاوت خواهند بود. برای تأیید این موضوع، از مقایسه برابری (==) اپراتور. در شما classes.py فایل، حذف print(speaker_one) و موارد زیر را به پایین کد خود اضافه کنید:

speaker_two = Speaker()

if speaker_one == speaker_two:
    print("speaker one is the same as speaker two")
else:
    print("speaker one is different from speaker two")

حالا اجرا کن python classes.py در شما terminal. خروجی زیر را دریافت خواهید کرد:

speaker one is different from speaker two

صفات کلاس و نمونه

در این بخش، ویژگی هایی را به خود اضافه می کنید Speaker کلاس شما می توانید ویژگی ها را به عنوان داده های ذخیره شده در یک شی ببینید. در حالی که ویژگی های کلاس برای همه نمونه های ایجاد شده از کلاس شما مشترک است، ویژگی های نمونه برای هر نمونه منحصر به فرد هستند.

پیشنهاد می‌کنیم بخوانید:  چگونه از Python SDK برای ساختن وب Scraper خود استفاده کنید

حال خود را اصلاح کنید classes.py کد خود را با کد زیر جایگزین کنید:

class Speaker:
    brand = "Beatpill" # class attribute

    def __init__(self, color, model):
        self.color = color # instance attribute
        self.model = model # instance attribute

شما باید قبلاً با خط یک کد جدید خود آشنا باشید. در خط دو، یک ویژگی کلاس را با نام تعریف کردید brand، و مقدار را به آن اختصاص داد Beatpill. ویژگی‌های کلاس، متغیرهایی هستند که به خود کلاس تعلق دارند، نه به نمونه‌های جداگانه کلاس. تأثیر ویژگی‌های کلاس این است که تمام نمونه‌هایی که از کلاس خود ایجاد می‌کنید، ویژگی کلاس و مقدار آن را به ارث می‌برند و به اشتراک می‌گذارند. در این مورد، هر نمونه ای که از خود ایجاد می کنید Speaker کلاس همان را به اشتراک خواهد گذاشت brand ارزش.

خط چهار کد شما یک را تعریف می کند __init__ روشی که دارای سه پارامتر استself، color، و model. هر زمان که یک نمونه جدید از خود ایجاد کنید، این متد فراخوانی می شود Speaker کلاس این self پارامتر مرجعی است به Speaker کلاس و این یک قرارداد در پایتون است که همیشه آن را به عنوان اولین پارامتر در a داشته باشیم __init__ روش. صفات نمونه مجموعه خط پنج و شش، color، و model به شما Speaker کلاس

بنابراین، هر بار که یک نمونه جدید از کلاس خود ایجاد می کنید، باید آرگومان هایی برای خود ارائه دهید color و model ویژگی های. عدم انجام این کار منجر به خطا می شود.

حالا موارد زیر را به پایین کد خود اضافه کنید:

speaker_one = Speaker("black", "85XB5")
speaker_two = Speaker("red", "Y8F33")

print(f"speaker one is {speaker_one.color} while speaker two is {speaker_two.color}")

با افزودن کد قبلی، دو نمونه از آن را ایجاد کردید Speaker کلاس –speaker_one و speaker_two. آرگومان ها در هر نمونه نشان دهنده مقادیر آنها هستند color و model ویژگی های. سپس پیامی را چاپ کردید که ویژگی رنگ هر شی را نشان می دهد. حالا اگر دستور را اجرا کنید python classes.py در شما terminal، خروجی را دریافت خواهید کرد:

speaker one is black while speaker two is red

برای مشاهده اینکه هر دو نمونه یکسان هستند brand ویژگی کلاس، خود را تغییر دهید print() عملکرد مانند این:

print(
    f"speaker one is {speaker_one.color} while speaker two is {speaker_two.color}",
    speaker_one.brand,
    speaker_two.brand,
    sep="\n",
)

حالا اجرا کن python classes.py و خروجی زیر را دریافت خواهید کرد:

speaker one is black and speaker two is red
Beatpill
Beatpill

روش های نمونه

علاوه بر ویژگی های کلاس و نمونه، کلاس ها می توانند متدهایی نیز داشته باشند که به روش های نمونه معروف هستند. متدهای نمونه توابعی هستند که در یک کلاس تعریف شده اند که عمل می کنند روی نمونه های کلاس آنها از ویژگی های کلاس و نمونه برای ارائه رفتار و عملکرد به اشیا استفاده می کنند.

برای افزودن متدهای نمونه، فایل کد خود را به صورت زیر تغییر دهید:

class Speaker:
    brand = "Beatpill"

    def __init__(self, color, model):
        self.color = color
        self.model = model

    def power_on(self):
        print(f"Powering روی {self.color} {self.model} speaker.")

    def power_off(self):
        print(f"Powering off {self.color} {self.model} speaker.")


speaker_one = Speaker("black", "85XB5")
speaker_two = Speaker("red", "Y8F33")

در مثال بالا، ما دو روش نمونه اضافه کرده‌ایم.power_on() و power_off(). این روش ها، درست مانند __init__ روش، گرفتن self به عنوان اولین استدلال

این power_on() متد پیامی را چاپ می کند که نشان می دهد بلندگوی رنگ و مدل داده شده در حال روشن شدن است روی. به طور مشابه، power_off() متد پیامی در مورد خاموش کردن بلندگو چاپ می کند.

برای فراخوانی این متدها، موارد زیر را به پایین فایل خود اضافه کنید:

speaker_one.power_on()
speaker_two.power_off()

حالا اجرا کن python classes.py در شما terminal و خروجی زیر را دریافت خواهید کرد:

Powering روی black 85XB5 speaker.
Powering off red Y8F33 speaker.

کپسوله سازی در پایتون

کپسولاسیون یکی از مفاهیم اصلی OOP است. به مجموعه داده ها (ویژگی ها) و روش ها در یک کلاس اشاره دارد. کپسوله سازی محافظت از داده ها و کنترل روش تعامل کد با وضعیت داخلی یک شی را فراهم می کند.

پیشنهاد می‌کنیم بخوانید:  نوشتن کد در جاوا اسکریپت - انواع و بهترین روش ها هدف اصلی از نوشتن کد این است که رایانه بتواند آن را به عنوان دستور تفسیر کند. با این حال، همچنین مهم است که کدی که می نویسیم به راحتی توسط توسعه دهندگان همکار قابل تفسیر باشد. آیا تا به حال به پروژه ای برگشته اید و در درک منطق داخلی مشکل داشته اید؟ خب احتمالا...

شما می توانید با تعریف ویژگی ها و متدهای خصوصی در یک کلاس به کپسوله سازی در پایتون برسید. طبق قرارداد، ویژگی ها و روش های خصوصی با یک زیرخط (_) پیشوند می شوند. در حالی که پایتون مانند برخی از زبان‌های دیگر دارای اصلاح‌کننده‌های خصوصی سخت‌گیرانه نیست، پیشوند زیر خط به عنوان هشداری برای توسعه‌دهندگان دیگر عمل می‌کند تا به ویژگی‌ها و متدها مستقیماً از خارج کلاس دسترسی نداشته باشند یا آنها را تغییر ندهند.

در اینجا نمونه ای از کپسوله سازی در پایتون آورده شده است:

class Speaker:
    brand = "Beatpill"

    def __init__(self, color, model):
        self._color = color  # Private attribute
        self._model = model  # Private attribute

    def power_on(self):
        print(f"Powering روی {self._color} {self._model} speaker.")

    def power_off(self):
        print(f"Powering off {self._color} {self._model} speaker.")

    def get_color(self):
        return self._color

    def set_color(self, new_color):
        self._color = new_color


speaker_one = Speaker("black", "85XB5")
speaker_one.power_on()

# Accessing a private attribute directly (not recommended)
print(speaker_one._color)

# Accessing a private attribute using the getter method (recommended)
print(speaker_one.get_color())

# Modifying a private attribute using the setter method (recommended)
speaker_one.set_color("white")
print(speaker_one.get_color())

در مثال قبل، color و model ویژگی ها ویژگی های خصوصی هستند Speaker کلاس اگر چه می توان مستقیماً از خارج از کلاس به این ویژگی ها دسترسی پیدا کرد و با استفاده از آن، برای مثال، print(speaker_one._color)، این عمل منع شده است. انجام این کار کپسوله سازی را نقض می کند و می تواند منجر به رفتار ناخواسته یا تخریب داده شود.

در عوض، کلاس دریافت کننده را فراهم می کند get_color() و تنظیم کننده set_color() روش هایی برای دسترسی و اصلاح ویژگی های خصوصی به شیوه ای کنترل شده. این روش‌ها به‌عنوان رابطی برای تعامل با وضعیت داخلی شی عمل می‌کنند، از یکپارچگی داده‌ها اطمینان می‌دهند و اعتبارسنجی اضافی را امکان‌پذیر می‌کنند.

کپسوله سازی ماژولار بودن کد، قابلیت نگهداری و حفاظت از داده ها را با جداسازی حالت داخلی از رابط عمومی (روش ها) ارتقا می دهد. این به شما امکان می دهد تا زمانی که رابط عمومی یکسان است، بدون تأثیر بر کدی که از کلاس استفاده می کند، وضعیت داخلی را تغییر دهید.

وراثت در پایتون

وراثت یکی دیگر از مفاهیم اصلی OOP است. به کلاس ها اجازه می دهد تا ویژگی ها و متدها را از کلاس های دیگر به ارث ببرند. کلاس جدید ویژگی ها و متدهایی را از کلاس موجود به ارث می برد که به عنوان کلاس والد یا پایه شناخته می شود. کلاس جدید را کلاس فرزند یا مشتق می گویند.

وراثت با اجازه دادن به کلاس فرزند برای ارث بردن و گسترش عملکرد کلاس والد، استفاده مجدد از کد را ترویج می کند. این به ایجاد روابط سلسله مراتبی بین کلاس ها و سازماندهی کد به شیوه ای ساختارمندتر و منطقی کمک می کند.

در پایتون، وراثت با استفاده از سینتکس زیر پیاده سازی می شود:

class DerivedClass(BaseClass):
    # Derived class methods and attributes

برای مشاهده روش عملکرد وراثت، کد خود را به صورت زیر تغییر دهید:

class Speaker:
    brand = "Beatpill"

    def __init__(self, color, model):
        self._color = color
        self._model = model

    def power_on(self):
        print(f"Powering روی {self._color} {self._model} speaker.")

    def power_off(self):
        print(f"Powering off {self._color} {self._model} speaker.")

# Add a SmartSpeaker class and make it inherit from the Speaker class
class SmartSpeaker(Speaker):
    def __init__(self, color, model, voice_assistant):
        super().__init__(color, model)
        self._voice_assistant = voice_assistant

    def say_hello(self):
        print(f"Hello, I am {self._voice_assistant}")


# Create an instance of the SmartSpeaker class
smart_speaker = SmartSpeaker("black", "XYZ123", "Alexa")
smart_speaker.power_on()  # Inherited from Speaker
smart_speaker.say_hello()

در کد قبلی، SmartSpeaker کلاس از Speaker کلاس این SmartSpeaker کلاس صفات و متدهای the را به ارث می برد Speaker کلاس

این __init__ روش از SmartSpeaker کلاس تماس می گیرد __init__ روش از Speaker کلاس با استفاده از super().__init__(color, model). این تضمین می کند که ارثی _color و _model ویژگی ها به درستی مقداردهی اولیه شده اند. همچنین SmartSpeaker کلاس ویژگی خاص خود را دارد _voice_assistant، و یک روش جدید say_hello.

حالا اجرا کن python classes.py در شما terminal و خروجی زیر را دریافت خواهید کرد:

Powering روی black XYZ123 speaker.
Hello, I am Alexa

نتیجه

در طول این مقاله، مزایای برنامه نویسی شی گرا (OOP) را برجسته کردیم و روش تعریف کلاس ها، ایجاد و استفاده از ویژگی ها و متدهای نمونه را نشان دادیم. ما مثال‌های عملی برای نشان دادن اجرای کلاس‌ها در پایتون و همچنین مفاهیم کلیدی OOP مانند کپسوله‌سازی و وراثت ارائه کردیم.

استفاده از درس های ارائه شده در این مقاله به شما کمک می کند تا تجربه برنامه نویسی پایتون خود را بهبود بخشیده و کارایی و قابلیت نگهداری کد خود را افزایش دهید.

مراجع و مطالعه بیشتر

  • https://en.wikipedia.org/wiki/Object-oriented_programming
  • https://realpython.com/python3-object-oriented-programming/
  • https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object-oriented_programming
  • https://docs.python.org/3/tutorial/classes.html
  • https://realpython.com/python-کلاس ها/
  • https://realpython.com/python-دو خط زیر/