اشیا و کلاس ها در برنامه نویسی پایتون

4 سال پیش

اشیا و کلاس ها در برنامه نویسی پایتون

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

پیشنهاد ویژه : پکیج آموزش طراحی وب سایت با پایتون و جنگو

 

اشیا و کلاس ها در برنامه نویسی پایتون

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

یک شی به سادگی مجموعه ای از داده ها (متغیرها) و روش ها (توابع) است که بر روی آن داده ها عمل می کنند. به طور مشابه، یک کلاس برای آن شی یک طرح است.

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

از آنجا که می توان بسیاری از خانه ها را از طرح اصلی یک خانه ساخت ، می توانیم اشیا زیادی را از یک کلاس ایجاد کنیم. یک شی به عنوان یک نمونه از کلاس و روند ایجاد این شی را نمونه سازی (instantiation) می نامند.

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

همانطور که تعریف تابع ها با کلیدواژه def در پایتون شروع می شوند ، تعاریف کلاس با کلیدواژه class  شروع می شوند.

اولین رشته داخل کلاس docstring نام دارد و توضیحات مختصری در مورد کلاس دارد. اگرچه اجباری نیست، اما بسیار توصیه می شود.

در اینجا یک تعریف کلاس ساده آورده شده است.

class MyNewClass:
    '''This is a docstring. I have created a new class'''
    pass

 

یک کلاس یک فضای نام محلی جدید ایجاد می کند که در آن تمام ویژگی های آن تعریف شده است. ویژگی ها ممکن است داده یا توابع باشند.

همچنین ویژگی های خاصی در آن وجود دارد که با زیرخط های دوگانه __ آغاز می شود. به عنوان مثال، __doc__ که docstring آن کلاس را به ما می دهد.

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

class Person:
    "This is a person class"
    age = 10

    def greet(self):
        print('Hello')


# Output: 10
print(Person.age)

# Output: <function Person.greet>
print(Person.greet)

# Output: 'This is my second class'
print(Person.__doc__)

 

خروجی

۱۰
<function Person.greet at 0x7fc78c6e8160>
This is a person class

 

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

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

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

>>> harry = Person()

 

این یک نمونه شی جدید به نام harry ایجاد می کند. با استفاده از پیشوند نام شی می توانیم به ویژگی های اشیا دسترسی پیدا کنیم.

ویژگی ها ممکن است داده یا روش باشند. متدهای یک شی توابع متناظر با آن کلاس هستند.

این به این معنی است که بگوییم، از آنجا که Person.greet یک تابع شی است (ویژگی کلاس)، Person.greet یک متد شی خواهد بود.

class Person:
    "This is a person class"
    age = 10

    def greet(self):
        print('Hello')


# create a new object of Person class
harry = Person()

# Output: <function Person.greet>
print(Person.greet)

# Output: <bound method Person.greet of <__main__.Person object>>
print(harry.greet)

# Calling object's greet() method
# Output: Hello
harry.greet()

 

خروجی

<function Person.greet at 0x7fd288e4e160>
<bound method Person.greet of <__main__.Person object at 0x7fd288e9fa30>>
Hello

 

ممکن است در تعریف تابع در کلاس متوجه پارامتر self شده باشید اما ما متد را بدون هیچ آرگومانی ()harry.greet می نامیم. و با این کار جواب هم می گیریم.

این بدان دلیل است که، هر زمان که یک شی متد خود را فراخوانی کند، خود شی به عنوان اولین آرگومان منتقل می شود. بنابراین، ()harry.greet  به (Person.greet(harry تبدیل می شود.

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

به همین دلایل، اولین آرگومان تابع در کلاس باید خود شی باشد. این را به طور معمول self می نامند. در غیر این صورت می توان نام برد اما ما به شدت توصیه می کنیم که این قرارداد را دنبال کنید.

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

توابع کلاس را که با زیرخط دوتایی __ شروع می شوند ، توابع خاص می نامند زیرا معنی خاصی دارند.

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

به این نوع تابع در برنامه نویسی شی گرا (OOP) سازنده نیز گفته می شود. ما معمولاً از آن برای مقداردهی اولیه همه متغیرها استفاده می کنیم.

class ComplexNumber:
    def __init__(self, r=0, i=0):
        self.real = r
        self.imag = i

    def get_data(self):
        print(f'{self.real}+{self.imag}j')


# Create a new ComplexNumber object
num1 = ComplexNumber(2, 3)

# Call get_data() method
# Output: 2+3j
num1.get_data()

# Create another ComplexNumber object
# and create a new attribute 'attr'
num2 = ComplexNumber(5)
num2.attr = 10

# Output: (5, 0, 10)
print((num2.real, num2.imag, num2.attr))

# but c1 object doesn't have attribute 'attr'
# AttributeError: 'ComplexNumber' object has no attribute 'attr'
print(num1.attr)

 

خروجی

۲+۳j
(۵, ۰, ۱۰)
Traceback (most recent call last):
  File "<string>", line 27, in <module>
    print(num1.attr)
AttributeError: 'ComplexNumber' object has no attribute 'attr'

 

در مثال بالا، کلاس جدیدی را برای نمایش اعداد مختلط تعریف کردیم. دارای دو تابع است، یکی () __init __  برای مقداردهی اولیه متغیرها (پیش فرض ها به صفر) و دیگری ()get_data  برای نمایش صحیح اعداد می باشد.

نکته جالب توجه در مرحله بالا این است که می توان ویژگی های یک شی را در حین اجرا ایجاد کرد. ما یک ویژگی Attr جدید برای شی num2 ایجاد کردیم و آن را نیز خواندیم. اما این ویژگی را برای شی num1 ایجاد نمی کند.

حذف ویژگی ها و اشیا در پایتون

با استفاده از عبارت del می توان هر ویژگی از یک شی را در هر زمان حذف کرد. برای دیدن خروجی موارد زیر را در Python shell امتحان کنید.

>>> num1 = ComplexNumber(2,3)
>>> del num1.imag
>>> num1.get_data()
Traceback (most recent call last):
...
AttributeError: 'ComplexNumber' object has no attribute 'imag'

>>> del ComplexNumber.get_data
>>> num1.get_data()
Traceback (most recent call last):
...
AttributeError: 'ComplexNumber' object has no attribute 'get_data'

 

حتی می توانیم با استفاده از دستور del، خود شی را حذف کنیم.

>>> c1 = ComplexNumber(1,3)
>>> del c1
>>> c1
Traceback (most recent call last):
...
NameError: name 'c1' is not defined

 

در واقع، این برنامه پیچیده تر از مورد قبلی است. وقتی (c1 = ComplexNumber (1، را انجام می دهیم، یک شی نمونه جدید در حافظه ایجاد می شود و نام c1 با آن پیوند می خورد.

در دستور del c1، این پیوند برداشته شده و نام c1 از فضای نام مربوطه حذف می شود. اما این شی در حافظه به حیات خود ادامه می دهد و اگر نام دیگری به آن پیوند نخورد، بعداً به طور خودکار از بین می رود.

این تخریب خودکار اشیا بدون مرجع در پایتون جمع آوری زباله (garbage collection) نامیده می شود.

 

منبع.

 

لیست جلسات قبل آموزش برنامه نویسی پایتون

  1. آموزش نصب و اجرای برنامه نویسی پایتون
  2. کلیدواژه ها و شناسه های برنامه نویسی پایتون
  3. دستورات، تورفتگی ها و کامنت ها در برنامه نویسی پایتون
  4. متغیرها، ثابت ها و لیترال ها در برنامه نویسی پایتون 
  5. انواع داده ها در برنامه نویسی پایتون
  6. تبدیل نوع در برنامه نویسی پایتون
  7. ورودی، خروجی و وارد کردن در برنامه نویسی پایتون
  8. عملگرها در برنامه نویسی پایتون
  9. نام و دامنه در برنامه نویسی پایتون
  10. دستور شرطی if…else در برنامه نویسی پایتون
  11. حلقه for در برنامه نویسی پایتون
  12. حلقه while در برنامه نویسی پایتون
  13. دستورات break و continue در برنامه نویسی پایتون
  14. دستور pass در برنامه نویسی پایتون
  15. توابع در برنامه نویسی پایتون
  16. آرگومان تابع در برنامه نویسی پایتون
  17. تابع بازگشتی در برنامه نویسی پایتون
  18. تابع بی نام/ تابع لامبدا در برنامه نویسی پایتون
  19. متغیرهای سراسری، محلی و غیر محلی در برنامه نویسی پایتون
  20. کلیدواژه global در برنامه نویسی پایتون
  21. ماژول های برنامه نویسی پایتون
  22. پکیج ها در برنامه نویسی پایتون
  23. اعداد و تبدیل نوع داده در برنامه نویسی پایتون 
  24. لیست در برنامه نویسی پایتون
  25. تاپل در برنامه نویسی پایتون 
  26. رشته ها در برنامه نویسی پایتون
  27. مجموعه ها در برنامه نویسی پایتون
  28. دیکشنری در برنامه نویسی پایتون
  29. عملیات ورودی/خروجی در برنامه نویسی پایتون 
  30. دایرکتوری و مدیریت فایل ها در برنامه نویسی پایتون
  31. خطاها و استثناهای توکار در برنامه نویسی پایتون
  32. مدیریت استثناها در برنامه نویسی پایتون
  33. استثناهای تعریف شده توسط کاربر در برنامه نویسی پایتون
  34. برنامه ‌نویسی شی گرا در پایتون
0
برچسب ها :
نویسنده مطلب erfan molaei

دیدگاه شما

بدون دیدگاه