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

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

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

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

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

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

بسته های کلاس: رفتار و State

یک کلاس به شما امکان می دهد رفتار و State (وضعیت) یک شی را با هم ترکیب کنید. برای درک بهتر نمودار زیر را رعایت کنید –

Bundles
نکات زیر هنگام بحث در مورد بسته های کلاسی قابل توجه است –

  • کلمه state با عملکرد یکسان است – این یک قطعه کد است که کاری را انجام می دهد (یا یک رفتار را پیاده سازی می کند)
  • کلمه state با متغیرها یکسان است – محلی برای ذخیره مقادیر در یک کلاس است.
  • وقتی رفتار و state کلاس را با هم ادعا می کنیم، به این معنی است که یک کلاس توابع و متغیرها را بسته بندی می کند.

کلاس های دارای متدها و ویژگی ها

در پایتون، ایجاد یک متد رفتار کلاس را تعریف می کند. کلمه Method نام OOP است که به یک تابع که در یک کلاس تعریف شده است داده می شود. به طور خلاصه –

  • Class functions – مترادف روش ها است
  • Class variables – مترادف ویژگی های نام است.
  • Class – نقشه ای برای نمونه ای با رفتار دقیق.
  • Object – یکی از نمونه های کلاس، عملکردهای تعریف شده در کلاس را انجام دهید.
  • Type – طبقه ای را نشان می دهد که نمونه به آن تعلق دارد
  • Attribute – هر مقدار شی: object.attribute
  • Method– یک “ویژگی قابل تماس” تعریف شده در کلاس

 

به عنوان مثال کد زیر را رعایت کنید –

var = “Hello, John”
print( type (var)) # ‘str’> or <class 'str'>
print(var.upper()) # upper() method is called, HELLO, JOHN

 

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

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

class MyClass(object):
   pass
# Create first instance of MyClass
this_obj = MyClass()
print(this_obj)
# Another instance of MyClass
that_obj = MyClass()
print (that_obj)

 

در اینجا ما یک کلاس به نام MyClass ایجاد کرده ایم که هیچ وظیفه ای را انجام نمی دهد. شیء آرگومان در کلاس MyClass شامل وراثت کلاس است و در درس های بعدی مورد بحث قرار می گیرد. pass در کد بالا نشان می دهد که این بلوک خالی است، یعنی یک تعریف کلاس خالی است.

اجازه دهید یک نمونه از این کلاس ()MyClass ایجاد کنیم و مطابق شکل آن را چاپ کنیم –

<__main__.MyClass object at 0x03B08E10>
<__main__.MyClass object at 0x0369D390>

 

در اینجا، ما یک نمونه از MyClass ایجاد کرده ایم. کد hex به آدرس محل ذخیره شیء اشاره دارد. مثال دیگر نشان دادن آدرس دیگری است.

حالا اجازه دهید یک متغیر را در کلاس ()MyClass تعریف کنیم و متغیر را از نمونه آن کلاس دریافت کنیم، همانطور که در کد زیر نشان داده شده است –

class MyClass(object):
   var = 9

# Create first instance of MyClass
this_obj = MyClass()
print(this_obj.var)

# Another instance of MyClass

that_obj = MyClass()
print (that_obj.var)

 

خروجی

هنگام اجرای کد بالا می توانید خروجی زیر را مشاهده کنید –

۹
۹

 

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

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

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

 

class MyClass(object):
   var = 9
   def firstM(self):
      print("hello, World")
obj = MyClass()
print(obj.var)
obj.firstM()

 

خروجی

۹
hello, World

 

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

class MyClass(object):
   def firstM(self):
      print("hello, World")
      print(self)
obj = MyClass()
obj.firstM()
print(obj)

 

 

خروجی

هنگام اجرای کد بالا می توانید خروجی زیر را مشاهده کنید –

hello, World
<__main__.MyClass object at 0x036A8E10>
<__main__.MyClass object at 0x036A8E10>

 

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

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

  • ساده سازی و درک آسان استفاده از یک شی بدون اطلاع از داخلی آن را آسان می کند.
  • هر تغییری را می توان به راحتی مدیریت کرد.

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

کپسوله سازی مکانیسم محدود کردن دسترسی به برخی از اجزای شی را در اختیار ما قرار می دهد ، این بدان معناست که نمای داخلی یک شی را نمی توان از خارج از تعریف شی مشاهده کرد. دسترسی به این داده ها معمولاً از طریق روشهای خاص – Getters و Setters انجام می شود.

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

class MyClass(object):
   def setAge(self, num):
      self.age = num

   def getAge(self):
      return self.age

zack = MyClass()
zack.setAge(45)
print(zack.getAge())

zack.setAge("Fourty Five")
print(zack.getAge())

 

خروجی

هنگام اجرای کد بالا می توانید خروجی زیر را مشاهده کنید –

۴۵
Fourty Five

 

داده ها باید تنها در صورتی که صحیح و معتبر باشند، با استفاده از سازه های Exception handling ذخیره شوند. همانطور که در بالا می بینیم، هیچ محدودیتی برای ورود کاربر به متد ()setAge وجود ندارد. این می تواند یک رشته، یک شماره یا یک لیست باشد. بنابراین برای اطمینان از صحت ذخیره شدن، باید کد بالا را بررسی کنیم.

class MyClass(object):
   def setAge(self, num):
      self.age = num

   def getAge(self):
      return self.age
zack = MyClass()
zack.setAge(45)
print(zack.getAge())
zack.setAge("Fourty Five")
print(zack.getAge())

 

متد __init__ به طور ضمنی به محض این که یک شی از یک کلاس نمونه سازی می شود، فراخوانی می شود. این باعث می شود که شیء اولیه شود.

x = MyClass()

 

خط کد نشان داده شده در بالا یک نمونه جدید ایجاد می کند و این شی را به متغیر محلی x اختصاص می دهد.

عملیات instantiation، که یک شیء کلاس را فراخوانی می کند، یک شیء خالی ایجاد می کند. بسیاری از کلاسها دوست دارند اشیاء را با نمونه های سفارشی شده برای یک حالت اولیه خاص ایجاد کنند. بنابراین، یک کلاس ممکن است یک روش خاص به نام “()__init __ ” را مطابق شکل تعریف کند –

def __init__(self):
   self.data = []

 

پایتون __init__ را در حین راه اندازی فرا می خواند تا یک ویژگی اضافی را تعریف کند که باید هنگام ایجاد یک کلاس ایجاد شود که ممکن است مقادیر اولیه را برای آن شی تنظیم کند یا یک روال معمول مورد نیاز را اجرا کند. بنابراین در این مثال ، یک نمونه جدید ، اولیه شده را می توان با –

x = MyClass()

 

روش ()__init __  می تواند برای انعطاف پذیری بیشتر دارای آرگومان های تک یا چندگانه باشد. init مخفف مقداردهی اولیه است، زیرا ویژگی های نمونه را مقداردهی می کند. به آن سازنده کلاس می گویند.

class myclass(object):
   def __init__(self,aaa, bbb):
      self.a = aaa
      self.b = bbb

x = myclass(4.5, 3)
print(x.a, x.b)

 

خروجی

 

۴٫۵ ۳

 

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

ویژگی تعریف شده در کلاس “ویژگی های کلاس” (“class attributes’) و ویژگی های تعریف شده در تابع “ویژگی های نمونه” (instance attributes) نامیده می شود. در هنگام تعریف، این ویژگی ها پیشوند خود نیستند، زیرا این ویژگیهای کلاس هستند و از یک نمونه خاص نیستند.

ویژگیهای کلاس را می توان توسط خود کلاس (className.attributeName) و همچنین نمونه های کلاس (inst.attributeName) قابل دسترسی بود. بنابراین ، نمونه ها هم به ویژگی نمونه و هم به ویژگی های کلاس دسترسی دارند.

>>> class myclass():
   age = 21
>>> myclass.age
۲۱
>>> x = myclass()
>>> x.age
۲۱
>>>

 

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

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

>>> class myclass(object):
   classy = 'class value'
>>> dd = myclass()
>>> print (dd.classy) # This should return the string 'class value'
class value
>>>
>>> dd.classy = "Instance Value"
>>> print(dd.classy) # Return the string "Instance Value"
Instance Value
>>>
>>> # This will delete the value set for 'dd.classy' in the instance.
>>> del dd.classy
>>> >>> # Since the overriding attribute was deleted, this will print 'class
value'.

>>> print(dd.classy)
class value
>>>

 

ما در کلاس dd ویژگی “classy” را نادیده می گیریم. وقتی لغو شد، مفسر پایتون مقدار نادیده گرفته شده را می خواند. اما هنگامی که مقدار جدید با ‘del’ حذف می شود ، مقدار نادیده گرفته شده دیگر در نمونه وجود ندارد ، و بنابراین جستجو به سطح بالاتر می رود و آن را از کلاس دریافت می کند.

آموزش کار با داده های کلاس و نمونه

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

یک نمونه می تواند به داده های کلاس دسترسی داشته باشد. اگر چندین نمونه ایجاد کنیم، این نمونه ها می توانند به مقادیر ویژگی های جداگانه خود و همچنین داده های کلی کلاس دسترسی داشته باشند.

بنابراین، داده های کلاس داده هایی هستند که بین همه نمونه ها به اشتراک گذاشته می شوند. کد زیر را برای درک بهتر رعایت کنید –

class InstanceCounter(object):
   count = 0 # class attribute, will be accessible to all instances
   def __init__(self, val):
      self.val = val
      InstanceCounter.count +=1 # Increment the value of class attribute, accessible through class name
# In above line, class ('InstanceCounter') act as an object
   def set_val(self, newval):
      self.val = newval

   def get_val(self):
      return self.val

   def get_count(self):
      return InstanceCounter.count
a = InstanceCounter(9)
b = InstanceCounter(18)
c = InstanceCounter(27)

for obj in (a, b, c):
   print ('val of obj: %s' %(obj.get_val())) # Initialized value ( 9, 18, 27)
   print ('count: %s' %(obj.get_count())) # always 3

 

خروجی

 

val of obj: 9
count: 3
val of obj: 18
count: 3
val of obj: 27
count: 3

 

به طور خلاصه، ویژگی های کلاس برای همه موارد کلاس یکسان است در حالی که ویژگی های نمونه برای هر نمونه خاص است. برای دو مورد مختلف، ما دو ویژگی نمونه متفاوت خواهیم داشت.

class myClass:
   class_attribute = 99

   def class_method(self):
      self.instance_attribute = 'I am instance attribute'

print (myClass.__dict__)

 

خروجی

هنگام اجرای کد بالا می توانید خروجی زیر را مشاهده کنید –

{'__module__': '__main__', 'class_attribute': 99, 'class_method': , '__dict__': , '__weakref__': , '__doc__': None}

 

ویژگی نمونه __ myClass .__ dict مطابق زیر می باشد:

>>> a = myClass()
>>> a.class_method()
>>> print(a.__dict__)
{'instance_attribute': 'I am instance attribute'}

 

منبع.

 

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

  1. آموزش برنامه نویسی شی گرا در پایتون
  2. آموزش مقدماتی برنامه نویسی شی گرا در پایتون
  3. آموزش راه اندازی محیط برنامه نویسی شی گرا در پایتون
  4. آموزش ساختار داده برنامه نویسی شی گرا در پایتون
0
برچسب ها :
نویسنده مطلب erfan molaei

دیدگاه شما

بدون دیدگاه