Python Classes and Objects

کلاس و اشیاء

پایتون یک زبان برنامه‌نویسی شیء گرا است (object oriented programming).

تقریباً می‌توان گفت که هر چیزی در پایتون یک شیء با خصوصیات و توابع شیء مخصوص به خود است.

کلاس به مانند سازنده (constructor) شیء یا نقشه (blueprint) ساختن شیء است.

ساختن کلاس

برای ساختن کلاس از کلیدواژه class استفاده می‌کنیم. در کد زیر یک کلاس که دارای خصوصیتی به اسم x است ساخته شده است.

class MyClass:
    x = 5

ساختن شیء

الان می‌توانی از اسم کلاس ساخته شده (MyClass)جهت ساختن شیء استفاده کنیم.

در کد زیر یک شیء به اسم p1 ایجاد و سپس مقدار x را پرینت کرده‌ایم.


class MyClass():
    x = 5

p1 = MyClass()
print(p1.x)

خروجی:

تابع ()__init__

مثال‌های بالا کلاس و شیء در ساده‌ترین حالت خود بودند و هیچ کاربرد واقعی ندارند.

جهت درک معنی کلاس باید تابع __init__() را درک کنیم.

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

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

در کد زیر کلاس Person را ساخته و با استفاده از تابع __init__() مقادیری را به اسم و سن اختصاص داده‌ایم.


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

p1 = Person("John", 36)

print(p1.name)
print(p1.age)

خروجی:

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

تابع ()__str__

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

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


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

p1 = Person("John", 36)

print(p1)

خروجی:

اما با تعیین تابع __str__() می‌توانیم تعیین کنیم که شیء کلاس چگونه نمایش داده شود.


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

    def __str__(self):
        return f"{self.name}({self.age})"

p1 = Person("John", 36)

print(p1)

خروجی:

تابع شیء

تابع شیء (methods) به تابعی (function) گفته می‌شود که متعلق به شیء باشد.

برای درک بهتر آن در کد زیر یک تابع شیء را در کلاس Person ایجاد کرده‌ایم. تابع ایجاد شده پیام سلام را پرینت می‌کند.


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

    def myfunc(self):
        print("Hello my name is " + self.name)

p1 = Person("John", 36)
p1.myfunc()

خروجی:

پارامتر self

پارامتر self ارجاعی به شیء ایجاد شده جاری از کلاس (current instance of the class) است و جهت دسترسی به متغیرهای متعلق به کلاس استفاده می‌شود.

البته ضرورتی ندارد که حتماً آن را self بنامیم. می‌توانید آن را هر چه که دوست دارید بنامید ولی باید حتماً اولین پارامتر هر تابعی درون کلاس باشد.

در زیر از دو واژه mysillyobject و abc استفاده کرده‌ایم. البته برنامه‌نویسان به صورت یک عرف اغلب از همان کلمه self استفاده می‌کنند.


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

    def myfunc(abc):
        print("Hello my name is " + abc.name)

p1 = Person("John", 36)
p1.myfunc()

خروجی:

تغییر خصوصیات یک شیء

برای تغییر خصوصیات یک شیء می‌توانید به صورت زیر عمل کنید.


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

    def myfunc(self):
        print("Hello my name is " + self.name)

p1 = Person("John", 36)

p1.age = 40

print(p1.age)

خروجی:

حذف خصوصیات یک شیء

با استفاده از کلیدواژه del می‌توان خصوصیات یک شیء را حذف کرد.


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

    def myfunc(self):
        print("Hello my name is " + self.name)

p1 = Person("John", 36)

del p1.age

print(p1.age)

خروجی:

حذف یک شیء

برای حذف یک شیء نیز می‌توان از کلیدواژه del استفاده کرد.


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

    def myfunc(self):
        print("Hello my name is " + self.name)

p1 = Person("John", 36)

del p1

print(p1)

خروجی:

دستور pass

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

class Person:
    pass