آموزش میانبرها در برنامه نویسی شی گرا در پایتون
آموزش میانبرها در برنامه نویسی شی گرا در پایتون
در این درس از مجموعه آموزش برنامه نویسی سایت سورس باران، به آموزش میانبرها در برنامه نویسی شی گرا در پایتون خواهیم پرداخت.
پیشنهاد ویژه : پکیج آموزش طراحی وب سایت با پایتون و جنگو
این درس به طور مفصل در مورد میانبرها در برنامه نویسی شی گرا در پایتون و توابع مختلف توکار در پایتون، عملیات ورودی و خروجی فایل و مفاهیم اضافه بار صحبت می کند.
آموزش توابع توکار پایتون
مفسر پایتون تعدادی توابع به نام توابع توکار دارد که به راحتی برای استفاده در دسترس هستند. در آخرین نسخه خود، پایتون شامل 68 تابع توکار است که در جدول زیر آمده است-
توابع توکار پایتون | ||||
---|---|---|---|---|
()abs | ()dict | ()help | ()min | ()setattr |
()all | ()dir | ()hex | ()next | ()slice |
()any | ()divmod | ()id | ()object | ()sorted |
()ascii | ()enumerate | ()input | ()oct | ()staticmethod |
()bin | ()eval | ()int | ()open | ()str |
()bool | ()exec | ()isinstance | ()ord | ()sum |
()bytearray | ()filter | ()issubclass | ()pow | ()super |
()bytes | ()float | ()iter | ()tuple | |
()callable | ()format | ()len | ()property | ()type |
()chr | ()frozenset | ()list | ()range | ()vars |
()classmethod | ()getattr | ()locals | ()repr | ()zip |
()compile | ()globals | ()map | ()reversed | ()__import__ |
()complex | ()hasattr | ()max | ()round | |
()delattr | ()hash | ()memoryview | ()set |
این بخش به طور خلاصه برخی از تابعهای مهم را مورد بحث قرار می دهد –
آموزش تابع ()len
تابع ()len طول رشته ها، لیست ها یا مجموعه ها را دریافت می کند. طول یا تعداد موارد یک شیء را برمی گرداند، جایی که شیء می تواند یک رشته، لیست یا مجموعه باشد.
1 2 |
>>> len(['hello', 9 , 45.0, 24]) 4 |
تابع ()len به صورت توکار مانند ()list .__ len __ یا ()tuple .__ len __ عمل می کند. بنابراین، توجه داشته باشید که ()len فقط روی اشیایی کار می کند که دارای متد ()__len __ هستند.
1 2 3 4 |
>>> set1 {1, 2, 3, 4} >>> set1.__len__() 4 |
با این حال در عمل ما به دلیل تابع _()len را به () __len__ به دلایل زیر ترجیح می دهیم –
- کارآمدتر است. و ضروری نیست که یک روش خاص برای امتناع از دسترسی به روشهای خاص مانند __len__ نوشته شود.
- نگهداری آن آسان است.
- از سازگاری عقب پشتیبانی می کند.
معکوس (seq)
تکرار کننده معکوس را برمی گرداند. seq باید شیئی باشد که متد _reversed__() یا پروتکل توالی روش () __len __ و روش () __getitem __ را پشتیبانی می کند. به طور کلی برای حلقه ها استفاده می شود وقتی می خواهیم موارد را از عقب به جلو حلقه بزنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
>>> normal_list = [2, 4, 5, 7, 9] >>> >>> class CustomSequence(): def __len__(self): return 5 def __getitem__(self,index): return "x{0}".format(index) >>> class funkyback(): def __reversed__(self): return 'backwards!' >>> for seq in normal_list, CustomSequence(), funkyback(): print('\n{}: '.format(seq.__class__.__name__), end="") for item in reversed(seq): print(item, end=", ") |
حلقه for در انتها لیست معکوس یک لیست معمولی و نمونه های دو دنباله سفارشی را چاپ می کند. خروجی نشان می دهد که ()reversed روی هر سه مورد کار می کند ، اما وقتی __reversed__ را تعریف می کنیم نتایج بسیار متفاوتی دارد.
خروجی
هنگام اجرای کد بالا می توانید خروجی زیر را مشاهده کنید –
1 2 3 |
list: 9, 7, 5, 4, 2, CustomSequence: x4, x3, x2, x1, x0, funkyback: b, a, c, k, w, a, r, d, s, !, |
متد ()enumerate یک شمارنده را به یک تکرار شونده اضافه می کند و شیء شمارش شده را برمی گرداند.
نحو ()enumerate این است –
1 |
enumerate(iterable, start = 0) |
در اینجا شروع آرگومان دوم اختیاری است و به طور پیش فرض شاخص با صفر (0) شروع می شود.
1 2 3 4 5 6 7 |
>>> # Enumerate >>> names = ['Rajesh', 'Rahul', 'Aarav', 'Sahil', 'Trevor'] >>> enumerate(names) <enumerate object at 0x031D9F80> >>> list(enumerate(names)) [(0, 'Rajesh'), (1, 'Rahul'), (2, 'Aarav'), (3, 'Sahil'), (4, 'Trevor')] >>> |
بنابراین ()enumerate یک تکرار کننده را باز می گرداند که یک تاپل را نشان می دهد که تعداد عناصر در دنباله منتقل شده را حفظ می کند. از آنجا که مقدار بازگشتی یک تکرار کننده است، دسترسی مستقیم به آن چندان مفید نیست. یک رویکرد بهتر برای ()enumerate نگه داشتن تعداد در یک حلقه for است.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
>>> for i, n in enumerate(names): print('Names number: ' + str(i)) print(n) Names number: 0 Rajesh Names number: 1 Rahul Names number: 2 Aarav Names number: 3 Sahil Names number: 4 Trevor |
بسیاری از توابع دیگر در کتابخانه استاندارد وجود دارد و در اینجا لیستی دیگر از توابع بیشتر مورد استفاده قرار می گیرد –
- hasattr ،getattr ،setattr و delattr که اجازه می دهد ویژگی های یک شی با نام رشته آنها دستکاری شود.
- all و any، که یک شی تکرار شونده را می پذیرند و اگر همه یا هر یک از موارد به عنوان درست ارزیابی شوند ، True را برمی گردانند.
- nzip، که دو یا چند دنباله می گیرد و یک دنباله جدید از چندتایی را برمی گرداند ، که در آن هر تاپل از هر دنباله یک مقدار واحد دارد.
فایل ورودی/خروجی
مفهوم فایل ها با عبارت برنامه نویسی شی گرا مرتبط است. پایتون رابط کاربری سیستم عامل ها را بصورت انتزاعی ارائه کرده است که به ما امکان کار با اشیاء فایل را می دهد.
تابع ()open ساخته شده برای باز کردن یک فایل و بازگشت یک شیء فایل استفاده می شود. این متداول ترین تابع با دو آرگومان است –
1 |
open(filename, mode) |
تابع ()open دو آرگومان می خواند، اول نام فایل و دوم state. در اینجا state می تواند برای حالت فقط خواندنی r باشد ، فقط برای نوشتن w. تا انتها ‘r+’ فایل را برای خواندن و نوشتن باز می کند. حالت پیش فرض فقط قابل خواندن است.
در پنجره ها، “b” ضمیمه به حالت پرونده را در حالت باینری باز می کند، بنابراین حالت هایی مانند “rb” ، “wb” و “r+b” نیز وجود دارد.
1 2 3 4 5 |
>>> text = 'This is the first line' >>> file = open('datawork','w') >>> file.write(text) 22 >>> file.close() |
در برخی موارد، ما فقط می خواهیم فایل موجود را ضمیمه کنیم و نه آن را بیش از حد بنویسیم، زیرا می توانیم مقدار “a” را به عنوان یک آرگومان حالت اضافه کنیم تا به انتهای فایل اضافه شود ، نه اینکه فایل موجود را کاملاً بازنویسی کنیم. فهرست.
1 2 3 4 5 |
>>> f = open('datawork','a') >>> text1 = ' This is second line' >>> f.write(text1) 20 >>> f.close() |
هنگامی که یک فایل برای خواندن باز می شود، می توانیم متد read ،readline یا خطوط خواندن را برای بدست آوردن محتویات فایل فراخوانی کنیم. متد read بسته به اینکه آرگومان دوم ‘b’ باشد ، کل محتویات فایل را به عنوان یک شی str یا bytes باز می گرداند.
برای خوانایی و جلوگیری از خواندن یک فایل بزرگ در یک زمان، اغلب بهتر است از حلقه for به طور مستقیم بر روی یک شیء فایل استفاده کنید. برای فایل های متنی، هر خط را یک به یک می خواند و ما می توانیم آن را در داخل بدن حلقه پردازش کنیم. برای فایل های باینری، بهتر است تکه های داده با اندازه ثابت را با استفاده از روش ()read بخوانید و پارامتری را برای حداکثر تعداد بایت برای خواندن ارسال کنید.
1 2 3 4 5 |
>>> f = open('fileone','r+') >>> f.readline() 'This is the first line. \n' >>> f.readline() 'This is the second line. \n' |
نوشتن روی یک فایل، از طریق روش نوشتن بر روی اشیاء فایل یک رشته شی صورت می گیرد. متد نوشتاری دنباله ای از رشته ها را می پذیرد و هر یک از مقادیر تکراری را در فایل می نویسد. روش نگارش خط بعد از هر مورد در دنباله خط جدیدی اضافه نمی کند.
سرانجام هنگام بستن یا خواندن فایل، روش ()close را باید فراخوانی کرد تا مطمئن شویم که نوشته های بافر شده روی دیسک نوشته شده اند، فایل به درستی پاک شده است و همه منابع مرتبط با فایل به عقب بازگردانده می شوند. سیستم عامل رویکرد بهتری برای فراخوانی متد ()close است اما از نظر فنی این امر به صورت خودکار هنگامی که اسکریپت وجود داشته باشد اتفاق می افتد.
جایگزینی برای اورلود کردن روش
اورلود روش به داشتن چندین روش با یک نام اشاره می کند که مجموعه های مختلف آرگومان را می پذیرند.
با توجه به یک روش یا تابع واحد، می توانیم تعداد پارامترها را خودمان تعیین کنیم. بسته به تعریف تابع، می توان آن را با صفر، یک، دو یا چند پارامتر فراخوانی کرد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class Human: def sayHello(self, name = None): if name is not None: print('Hello ' + name) else: print('Hello ') #Create Instance obj = Human() #Call the method, else part will be executed obj.sayHello() #Call the method with a parameter, if part will be executed obj.sayHello('Rahul') |
خروجی
1 2 |
Hello Hello Rahul |
آموزش آرگومان های پیش فرض در برنامه نویسی شی گرا در پایتون
یک شیء قابل فراخوانی یک شی است که می تواند برخی از آرگومان ها را بپذیرد و احتمالاً یک شی را برمی گرداند. یک تابع ساده ترین شیء قابل فراخوانی در پایتون است ، اما برخی دیگر نیز شبیه کلاس ها یا نمونه های کلاس خاصی هستند.
هر تابع در پایتون یک شی است. اشیاء می توانند شامل متدها یا توابع باشند اما شیء یک تابع ضروری نیست.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
def my_func(): print('My function was called') my_func.description = 'A silly function' def second_func(): print('Second function was called') second_func.description = 'One more sillier function' def another_func(func): print("The description:", end=" ") print(func.description) print('The name: ', end=' ') print(func.__name__) print('The class:', end=' ') print(func.__class__) print("Now I'll call the function passed in") func() another_func(my_func) another_func(second_func) |
در کد بالا ما می توانیم دو تابع مختلف را به عنوان آرگومان به تابع سوم خود منتقل کنیم و برای هر یک خروجی متفاوتی دریافت کنیم –
1 2 3 4 5 6 7 8 9 10 |
The description: A silly function The name: my_func The class: Now I'll call the function passed in My function was called The description: One more sillier function The name: second_func The class: Now I'll call the function passed in Second function was called |
اشیاء قابل فراخوانی
همانطور که توابع اجسامی هستند که می توانند ویژگی هایی روی آنها داشته باشند، می توان یک شی ایجاد کرد که بتوان آن را مانند یک تابع فراخوانی کرد.
در پایتون هر شی با روش ()__call __ می تواند با استفاده از function-call فراخوانی شود.
دیدگاه شما