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

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

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

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

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

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

نحو اصلی در طراحی کلاس 

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

>>> var1 = 'Hello'
>>> var2 = ' World!'
>>> var1 + var2
'Hello World!'
>>>
>>> var1.__add__(var2)
'Hello World!'
>>> num1 = 45
>>> num2 = 60
>>> num1.__add__(num2)
۱۰۵
>>> var3 = ['a', 'b']
>>> var4 = ['hello', ' John']
>>> var3.__add__(var4)
['a', 'b', 'hello', ' John']

 

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

ما یک کلاس به نام Sumlist داریم که دارای یک __init__ سازنده است که لیست را به عنوان یک آرگومان به نام my_list در نظر می گیرد.

class SumList(object):
   def __init__(self, my_list):
      self.mylist = my_list
   def __add__(self, other):
     new_list = [ x + y for x, y in zip(self.mylist, other.mylist)]

     return SumList(new_list)
   
   def __repr__(self):
      return str(self.mylist)

aa = SumList([3,6, 9, 12, 15])

bb = SumList([100, 200, 300, 400, 500])
cc = aa + bb # aa.__add__(bb)
print(cc) # should gives us a list ([103, 206, 309, 412, 515])

 

خروجی

[۱۰۳ ، ۲۰۶ ، ۳۰۹ ، ۴۱۲ ، ۵۱۵]

 

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

'abc' in var # var.__contains__('abc')
var == 'abc' # var.__eq__('abc')
var[1] # var.__getitem__(1)
var[1:3] # var.__getslice__(1, 3)
len(var) # var.__len__()
print(var) # var.__repr__()

 

ارث بردن از انواع توابع توکار

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

در مثال زیر، ما از دیکشنری می گیریم، اما سپس یکی از روش های آن __setitem__ را پیاده سازی می کنیم. وقتی کلید و مقدار را در دیکشنری تعیین می کنیم، این (setitem) فراخوانی می شود. از آنجا که این یک روش جادویی است، به طور ضمنی فراخوانی می شود.

class MyDict(dict):

   def __setitem__(self, key, val):
      print('setting a key and value!')
      dict.__setitem__(self, key, val)

dd = MyDict()
dd['a'] = 10
dd['b'] = 20

for key in dd.keys():
   print('{0} = {1}'.format(key, dd[key]))

 

خروجی

setting a key and value!
setting a key and value!
a = 10
b = 20

 

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

# Mylist inherits from 'list' object but indexes from 1 instead for 0!
class Mylist(list): # inherits from list
   def __getitem__(self, index):
      if index == 0:
         raise IndexError
      if index > 0:
         index = index - 1
         return list.__getitem__(self, index) # this method is called when

# we access a value with subscript like x[1]
   def __setitem__(self, index, value):
      if index == 0:
         raise IndexError
      if index > 0:
      index = index - 1
      list.__setitem__(self, index, value)

x = Mylist(['a', 'b', 'c']) # __init__() inherited from builtin list

print(x) # __repr__() inherited from builtin list

x.append('HELLO'); # append() inherited from builtin list

print(x[1]) # 'a' (Mylist.__getitem__ cutomizes list superclass
               # method. index is 1, but reflects 0!

print (x[4]) # 'HELLO' (index is 4 but reflects 3!

 

خروجی

 

['a', 'b', 'c']
a
HELLO

 

در مثال بالا  ما یک لیست سه موردی در Mylist تنظیم می کنیم و روش __init__ به طور ضمنی فراخوانی می شود و وقتی عنصر x را چاپ می کنیم، لیست سه مورد ([‘a’ ، ’b’ ، ‘c’] را دریافت می کنیم. سپس عنصر دیگری را به این لیست اضافه می کنیم. بعداً ما نمایه ۱ و ایندکس ۴ را درخواست می کنیم. اما اگر خروجی را مشاهده کردید، ما از (index-1) چیزی که درخواست کرده ایم دریافت می کنیم. همانطور که می دانیم فهرست بندی از ۰ شروع می شود اما در اینجا فهرست بندی از ۱ شروع می شود (به همین دلیل ما اولین مورد لیست را دریافت می کنیم).

آموزش قراردادهای نامگذاری در پایتون

در این مقاله اسامی را که برای متغیرها استفاده می کنیم، به ویژه متغیرهای خصوصی و قراردادهای مورد استفاده برنامه نویسان پایتون در سراسر جهان، بررسی می کنیم. اگرچه متغیرها به عنوان خصوصی تعیین می شوند، اما حریم خصوصی در پایتون وجود ندارد و این بر اساس طراحی است. مانند هر زبان دیگری که به خوبی مستند شده است، پایتون قراردادهای نامگذاری و شیوه ای دارد که آنها را ترویج می کند، اگرچه آنها را اجرا نمی کند. یک راهنمای مختصر وجود دارد که توسط “Guido van Rossum” مبدع پایتون نوشته شده است ، که بهترین شیوه ها و استفاده از نام را توصیف می کند و PEP8 نامیده می شود. در اینجا پیوند این مورد وجود دارد ، https://www.python.org/dev/peps/pep-0008/

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

  • نام های ماژول – all_lower_case
  • نام کلاسها و نامهای استثنا – CamelCase
  • نامهای جهانی و محلی – all_lower_case
  • توابع و نام روش – all_lower_case
  • ثابت ها – ALL_UPPER_CASE

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

چرا باید مطابق با کنوانسیون عمل کرد؟

ما می توانیم توصیه PEP را که به ما اجازه می دهد بدست آوریم ، دنبال کنیم ،

  • برای اکثر قریب به اتفاق توسعه دهندگان بیشتر آشنا است
  • کد شما برای اکثر خوانندگان واضح تر است.
  • با سبک سایر مشارکت کنندگان که بر اساس کد یکسان کار می کنند مطابقت دارد.
  • علامت توسعه دهندگان نرم افزار حرفه ای
  • همه شما را خواهند پذیرفت.

آموزش نامگذاری متغیر  عمومی و خصوصی در پایتون

در پایتون وقتی با ماژول ها و کلاس ها سروکار داریم، برخی متغیرها یا ویژگی را به عنوان خصوصی تعیین می کنیم. در پایتون ، هیچ متغیر نمونه “خصوصی” وجود ندارد که به جز در داخل یک شیء قابل دسترسی نباشد. خصوصی به سادگی به این معنی است که آنها به سادگی برای استفاده کاربران از کد در نظر گرفته نشده اند، بلکه به منظور استفاده داخلی هستند. به طور کلی، اکثر توسعه دهندگان پایتون از یک کنوانسیون پیروی می کنند، به عنوان مثال، نامی با پیشوند با یک زیرنویس برای مثال. _attrval (مثال زیر) باید به عنوان یک بخش غیر عمومی API یا هر کد پایتون، اعم از یک تابع، یک روش یا یک عضو داده تلقی شود. در زیر کنوانسیون نامگذاری است که ما دنبال می کنیم،

  • ویژگی ها یا متغیرهای عمومی (در نظر گرفته شده برای وارد کننده این ماژول یا کاربر این کلاس استفاده شود) aseregular_lower_case
  • خصوصیات یا متغیرهای خصوصی (استفاده داخلی توسط ماژول یا کلاس) −_single_leading_underscore
  • ویژگی های خصوصی که نباید زیر طبقه بندی شوند ____ double_leading_underscore
  • ویژگی های جادویی −__ double_underscores __

 

class GetSet(object):

   instance_count = 0 # public
   
   __mangled_name = 'no privacy!' # special variable

   def __init__(self, value):
      self._attrval = value # _attrval is for internal use only
      GetSet.instance_count += 1

   @property
   def var(self):
      print('Getting the "var" attribute')
      return self._attrval

   @var.setter
   def var(self, value):
      print('setting the "var" attribute')
      self._attrval = value

   @var.deleter
   def var(self):
      print('deleting the "var" attribute')
      self._attrval = None

cc = GetSet(5)
cc.var = 10 # public name
print(cc._attrval)
print(cc._GetSet__mangled_name)

 

خروجی

setting the "var" attribute
۱۰
no privacy!

 

منبع.

 

 

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

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

دیدگاه شما

بدون دیدگاه