برنامه نویسی

آموزش کاربردی برنامه نویسی شی گرا در پایتون

یک شیوه برنامه‌نویسی کامپیوتری به نام برنامه‌نویسی شی گرا (Object-Oriented Programming) یا به اختصار OOP، استفاده می‌شود. در این شیوه، طراحی نرم‌افزار براساس اشیاء و داده‌ها صورت می‌گیرد به جای تمرکز بر توابع و منطق.

برنامه‌نویسی شی گرا به نوشتن کدهای پروژه‌های بزرگ سهولت و خوانایی بیشتری می‌بخشد و باعث می‌شود کدها ساختار منظم‌تری داشته باشند. یکی از زبان‌های کامپیوتری که به صورت شی نوشته شده است، پایتون است. در این زبان، هر متغیر و داده‌ای که تعریف می‌شود، یک شی محسوب می‌شود.

در ادامه، نحوه نوشتن یک برنامه به صورت شی گرا در پایتون را مشاهده خواهید کرد.

ایجاد شی در پیاتون

ایجاد یک شی در پایتون به معنای ایجاد یک نمونه از یک کلاس است. برای ایجاد یک شی، ابتدا باید یک کلاس تعریف کنید و سپس از این کلاس یک نمونه ایجاد کنید. برای آموزش بهتر، به مثال زیر توجه کنید:

class Person: def init(self, name, age): self.name = name self.age = age

 
def introduce(self):
    print("Hello! I am " + self.name + " and I am " + str(self.age) + " years old.")

Create an instance of the Person class with name "Ali" and age 25

ali = Person("Ali", 25)
Use the introduce function on the ali instance

ali.introduce()

در این مثال، یک کلاس به نام “Person” تعریف شده است. این کلاس دو ویژگی نام و سن را دارد. تابع __init__ که معروف به “سازنده” است با استفاده از پارامترهای داده شده، ویژگی های شیء را مقداردهی اولیه می کند. توابعی که درون کلاس تعریف می شوند و به شیء مربوطه ارجاع دارند، به عنوان “متد” های شیء شناخته می شوند. تابع introduce، یک متدی است که نام و سن شیء را چاپ می کند.

سپس با استفاده از کلمه کلیدی “کلاس.نام_کلاس” از کلاس Person یک نمونه به نام ali ایجاد می کنیم. سپس متد introduce را بر روی نمونه ali فراخوانی می کنیم و متد اطلاعات شیء را چاپ می کند.

خروجی این برنامه به شکل زیر خواهد بود:

Hello! I am Ali and I am 25 years old.

همچنین می توانید از ویژگی های شیء به شکل زیر دسترسی داشته باشید:

Accessing Object Properties

print(ali.name) # Ali 
print(ali.age) # 25

خروجی:

ali
۲۵

با استفاده از این روش می توانید یک شیء با ویژگی ها و متدهای دلخواه خود را ایجاد کنید و برای انجام عملیات های مربوطه از آن استفاده کنید.

آشنایی با سازنده‌ها در پایتون (constructors)

در پایتون، سازنده‌ها متدی هستند که هنگام ایجاد یک نمونه از یک کلاس، به‌طور خودکار فراخوانی می‌شوند. این متدها با استفاده از نام خاص __init__ تعریف می‌شوند.

سازنده‌ها برای ایجاد متغیرهای عضو کلاس و انجام عملیات مقدماتی در هنگام ایجاد یک نمونه از کلاس استفاده می‌شوند. به عبارتی، مقادیر اولیه برخی از ویژگی‌ها را تعیین می‌کنند و هر بار که یک نمونه از کلاس ایجاد می‌شود، این متد فراخوانی می‌شود.

مثالی از تعریف سازنده در پایتون:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

در این مثال، سازنده کلاس Person دو پارامتر name و age را می‌گیرد و مقادیر آنها را به ویژگی‌های name و age متغیر self اختصاص می‌دهد. به عبارتی، هر نمونه از کلاس Person مقداری برای name و age به همراه خواهد داشت.

برای ایجاد یک نمونه از کلاس Person و استفاده از سازنده، می‌توان به شکل زیر عمل کرد:

person1 = Person("John", 25)
print(person1.name)  # خروجی: John
print(person1.age)  # خروجی: ۲۵

در این مثال، یک نمونه از کلاس Person با نام “John” و سن ۲۵ ایجاد شده است. سازنده کلاس Person مقادیر “John” و ۲۵ را به ترتیب به name و age اختصاص داده است. سپس این ویژگی‌ها را می‌توان با استفاده از نمونه person1 در برنامه دسترسی داد.

پارامتر self در شی گرایی پایتون چیست

پارامتر self در شی گرایی پایتون یک پارامتر ویژه است که در تعریف توابع و روش‌های یک کلاس باید استفاده شود. self به عنوان یک نمونه از خود کلاس (instance of the class) عمل می‌کند و با استفاده از آن می‌توان به ویژگی‌ها و روش‌های داخلی کلاس دسترسی پیدا کرد.

وقتی تعریف می‌کنید self به معنای خود شئی است که می‌سازید وقتی از آن شئ استفاده می‌کنید به خود اشاره می‌کنید. به این صورت که self به عنوان یک پارامتر به هر تعریف تابع یا تماس با یک متد اضافه می‌شود.

معمولاً self به صورت پیش‌فرض به عنوان اولین پارامتر در تابع یا متد قرار می‌گیرد. توجه داشته باشید که در حقیقت نام self نمی‌تواند تغییر کند، اما برخی برنامه نویسان از نام دیگری به جای self استفاده می‌کنند، اما بهتر است از نام self استفاده کنید تا کد شما خوانایی بهتری داشته باشد.

اینجا یک نمونه کد پارامتر self در زبان Python آمده است:

class MyClass:
    def __init__(self, name):
        self.name = name

    def say_hello(self):
        print("Hello, " + self.name + "!")

my_object = MyClass("John")
my_object.say_hello()  # خروجی: "Hello, John!"

در این مثال، کلاس MyClass دارای ویژگی name و تابع say_hello است. وقتی یک شئ (مانند my_object) از این کلاس ایجاد می‌شود، مقدار داده‌شده به پارامتر name در تابع __init__ به ویژگی name اختصاص داده می‌شود.

سپس با فراخوانی تابع say_hello بر روی این شئ، پیام "Hello, John!" در خروجی چاپ می‌شود. در فراخوانی تابع به‌وسیله my_object.say_hello()، پارامتر self به صورت خودکار به تابع پاس داده می‌شود.

وراثت (inheritance) در پایتون چیست و چه کاربردی دارد؟

وارثی (inheritance) یکی از اصول اصلی برنامه نویسی شی گرا در پایتون است که به ارث بردن و اشتقاق کلاس ها از یکدیگر اشاره دارد.

در وارثی، یک کلاس جدید می تواند از یک کلاس موجود به عنوان پدر (یا superclass) ارث برده و ویژگی ها و رفتارهای آن کلاس را به ارث ببرد. کلاس جدید که از کلاس موجود ارث بری می کند به عنوان کلاس فرزند (یا subclass) شناخته می شود.

برای ارث بردن در پایتون، کافی است نام کلاس پدر را در پرانتز پس از نام کلاس فرزند قرار دهیم. به عنوان مثال:

class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        print(f"{self.name} is speaking")

class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name)
        self.breed = breed

    def speak(self):
        print(f"{self.name} is barking")

animal = Animal("Animal")
animal.speak()  # Output: Animal is speaking

dog = Dog("Buddy", "Labrador")
dog.speak()  # Output: Buddy is barking

در این مثال، کلاس Animal دارای متد speak است که متن پیغام را چاپ می کند. سپس کلاس Dog از کلاس Animal ارث بری می کند و متد speak را override کرده و پیغام را به صورت “Buddy is barking” چاپ می کند.

دقت کنید که از super().__init__(name) در متد __init__ کلاس Dog استفاده شده است تا کلاس پدر بتواند تمام مقادیر ویژگی ها از کلاس فرزند را دریافت کند.

آموزش خصوصی کردن متغیرهای کلاس پدر در پایتون

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

مثال:

class ParentClass:
    def __init__(self):
        self._public_variable = "This is a public variable"
        self.__private_variable = "This is a private variable"

parent = ParentClass()

print(parent._public_variable)  # خروجی: This is a public variable
print(parent.__private_variable)  # خطا: AttributeError: 'ParentClass' object has no attribute '__private_variable'

همانطور که مشاهده می‌کنید، متغیر با نشانگر “_” خصوصی شده است و هرچند می‌توان از آن دسترسی داشت، اما به عنوان یک قرارداد، می‌توان از این متغیرها با استفاده از نمونه‌های کلاس دسترسی نداد.

انواع ارث‌ بری در پایتون

در پایتون، ارث‌بری به چندین روش مختلف صورت می‌گیرد. برخی از انواع ارث‌بری در پایتون عبارت‌اند از:

ارث‌بری تک مرحله‌ای (Single Inheritance):
در این نوع از ارث‌بری، یک کلاس تنها از یک کلاس دیگر ارث‌بری می‌کند.

ارث‌بری چند مرحله‌ای (Multiple Inheritance):
در این نوع ارث‌بری، یک کلاس می‌تواند از چند کلاس ارث‌بری کند.

ارث‌بری موضعی (Hierarchical Inheritance):
در این نوع از ارث‌بری، چندین کلاس از یک کلاس پایه ارث‌بری می‌کنند.

ارث‌بری چندگانه (Multilevel Inheritance):
در این نوع از ارث‌بری، یک کلاس از یک کلاس دیگر وارث است که خود از یک کلاس دیگر نیز ارث‌بری می‌کند.

ارث‌بری ترکیبی (Mixin Inheritance):
در این نوع از ارث‌بری، کلاس‌ها از حالت‌ها (mixins) جداگانه‌ای که شامل توابع و ویژگی‌های مشترک استفاده می‌شود، ارث‌بری می‌کنند.

ارث‌بری ویژگی (Interface Inheritance):
در این نوع از ارث‌بری، کلاس‌ها فقط ویژگی‌ها (متدها و ویژگی‌های پرونده) را ارث‌بری می‌کنند بدون ارث‌بری پیاده‌سازی‌های مربوط به آن‌ها.

نوع ارث‌بری مورد استفاده در هر مورد خاص بستگی به طراحی کلاس و ساختار مدل دارد.

آموزش زیرکلاس (Subclassing)

زیرکلاس بخشی از مفهوم برنامه‌نویسی شیءگرا است که در آن یک کلاس جدید (زیرکلاس یا زیرمجموعه) با گسترش و گرفتن ویژگی‌ها و عملکردی از یک کلاس موجود (کلاس اصلی یا کلاس والد) ساخته می‌شود.

با استفاده از زیرکلاس‌ها، امکان ارث بری و استفاده مجدد از کد و ویژگی‌ها در برنامه‌نویسی فراهم می‌شود. زیرکلاس می‌تواند ویژگی‌ها، روش‌ها و عملکرد کلاس والد را به ارث ببرد و به صورت خودکار از آنها استفاده کند. همچنین، زیرکلاس قادر است ویژگی‌ها و رفتار اضافی خود را نیز به ارث ببرد و در صورت نیاز، تغییر و بهبود آنها را انجام دهد.

برای ارث بردن از یک کلاس والد، می‌توان از کلمه کلیدی “extends” (برای زبان‌های مشابه کافی نیست و باید بیشتر رویکرد یا نحوه نوشتن آن را بررسی کنید) استفاده کرد. به عنوان مثال، در زبان جاوا کد زیر نشان می‌دهد که کلاس “زیرکلاس” از کلاس “کلاس والد” ارث برده است:

class ParentClass {
    // Properties and methods of the parent class
}

class SubClass extends ParentClass {
    // Properties and methods of the sub class
}

با استفاده از زیرکلاس‌ها، می‌توان نسخه‌های متفاوتی از یک کلاس را با تغییر و بهبود ویژگی‌ها و روش‌ها تعریف کرد. همچنین، زیرکلاس‌ها به صورت سلسله‌مراتبی می‌توانند تعریف شوند، به این معنی که یک زیرکلاس می‌تواند به عنوان کلاس والد برای یک زیرکلاس دیگر عمل کند.

Polymorphism در پایتون چیست و چه کاربردی دارد؟

چندریختی یا Polymorphism در پایتون به امکان تعریف توابع و کلاس‌هایی با همین نام اما با ویژگی‌ها و رفتارهای متفاوت در موارد مختلف اشاره دارد.

به طور معمول، در پایتون می‌توان یک تابع را با اسامی یکسان تعریف کرد اما با ورودی و خروجی‌های متفاوت. به این تابع، تابع چندریختی گفته می‌شود. به علاوه، در پایتون می‌توان یک کلاس را با اسمی یکسان تعریف کرد اما با روش‌های متفاوت. به این کلاس، کلاس چندریختی گفته می‌شود.

استفاده از چندریختی در پایتون، امکان استفاده مجدد و کاهش کد نویسی را فراهم می‌کند. با استفاده از چندریختی، کد قابلیت انعطاف بیشتری در برابر تغییرات در موارد مختلف را خواهد داشت. یک مثال از چندریختی در پایتون، استفاده از تابع print می‌باشد. تابع print می‌تواند با ورودی‌های متفاوت کار کند و متفاوت عمل کند. به عنوان مثال، در حالت ساده می‌توانید یک رشته را به عنوان ورودی به تابع print بدهید و نتیجه را در خروجی چاپ کند:

print("Hello, World!")

همچنین، می‌توانید چندین ورودی را به تابع print بدهید و هر کدام را با استفاده از فاصله جدا کنید:

print(4, "+", 3, "=", 7)

اگر ورودی‌هایی با نوع داده متفاوت داشته باشید، print همچنین می‌تواند با استفاده از چندریختی عمل کند. به عنوان مثال:

x = [1, 2, 3]
y = {"name": "John", "age": 30}
z = 10

print(x, y, z)

با استفاده از چندریختی در این مثال، تابع print متوجه نوع داده‌ها می‌شود و به طور متناسب با آن‌ها عمل می‌کند.

چند ریختی با متدهای کلاس در پیاتون + مثال کاربردی

متدهای کلاس در پایتون می‌توانند به صورت زیر باشند:

  1. __init__: این متد در هنگام ساخت یک شیء از کلاس فراخوانی می‌شود و تمامی مقادیر اولیه را برای شیء تعریف می‌کند. معمولاً متغیرهای کلاس و توابع دیگری که در این کلاس استفاده می‌شوند در اینجا تعریف می‌شوند.
  2. __str__: این متد برای تعیین رشته‌ای که توصیفی از شیء کلاس را برمی‌گرداند، استفاده می‌شود. این رشته معمولاً برای چاپ یا نمایش اطلاعات مربوط به شیء استفاده می‌شود.
  3. __repr__: این متد برای تعریف نمایشی قابل قبول از شیء کلاس استفاده می‌شود. این متد بیشتر برای استفاده در محیط‌های تعاملی مفید است.
  4. __len__: این متد برای محاسبه طول یا تعداد عناصر یک شیء کلاس استفاده می‌شود. به عنوان مثال، در یک کلاس لیست، می‌توان این متد را برای بازگرداندن تعداد عناصر در لیست تعریف کرد.
  5. __getitem__ و __setitem__: این دو متد برای دسترسی به عناصر یک شیء کلاس با استفاده از نمادهای [] استفاده می‌شوند. مثلاً اگر بخواهید یک شیء را مانند یک لیست یا دیکشنری بسته به شاخص دسترسی کنید، از این دو متد استفاده می‌کنید.

مثال کاربردی:
فرض کنید که یک کلاس به نام “Employee” برای نمایش اطلاعات یک کارمند داریم. این کلاس شامل متغیرهای مربوط به نام، سن و حقوق کارمند است. در ادامه، نحوه استفاده از برخی از متدهای کلاس را نشان می‌دهیم:

class Employee:
    def __init__(self, name, age, salary):
        self.name = name
        self.age = age
        self.salary = salary

    def __str__(self):
        return f"Name: {self.name}, Age: {self.age}, Salary: {self.salary}"

    def get_salary_in_year(self):
        return self.salary * 12

employee1 = Employee("John", 30, 5000)

print(employee1)  # Output: Name: John, Age: 30, Salary: 5000
print(employee1.get_salary_in_year())  # Output: 60000

در این مثال، متد __init__ برای تنظیم مقادیر اولیه، متد __str__ برای تعیین یک رشته توصیفی از کلاس و متد get_salary_in_year برای محاسبه حقوق سالیانه تعریف شده است.

جمع بندی: کاربرد شی‌گرایی در پایتون چیست؟

در این مقاله، مفهوم و کاربرد شی گرایی در پایتون آموخته شد. مباحثی مانند متدها، متدهای سازنده، متغیرهای نمونه و خصوصی، کپسوله سازی و وراثت مطرح شدند. اما این مباحث تنها مباحث مقدماتی بودند و مباحث پیشرفته‌تر در شی گرایی در پایتون در این مقاله پوشش داده نشدند. در صورت علاقه به برنامه نویسی و مباحث پیشرفته، می توانید نظرات خود درباره برنامه نویسی شی گرا را بیان کنید.

اگر به یادگیری بیشتر در زمینه برنامه نویسی پایتون علاقه دارید، یادگیری زبان پایتون بسیار ساده است و با شرکت در دوره های آموزشی متخصص پایتون توسعه وب، می توانید در آینده قادر به ساخت اپلیکیشن های موبایل و دسکتاپ باشید و به حوزه هوش مصنوعی نیز وارد شوید.

پوریا گودرز

پوریا گودرز هستم‌ علاقه مند به مباحث‌ و‌‌ مشکلات مربوط به تکنولوژی و فناوری. همچنین اندک آشنایی در زمینه گرافیک دارم. امیدوارم بتونم مشکلات شما رو در این مباحث حل کنم . انتقادات خود را از بخش نظرات با من در میان بگذارید :)

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *