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

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

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


«زبان برنامه‌نویسی پایتون» (Python Programming Language)، یک زبان برنامه‌نویسی چند پارادایمی است. بدین معنا که از رویکردهای برنامه‌نویسی گوناگونی پشتیبانی می‌کند. یک راهکار محبوب برای حل مسائل برنامه‌نویسی، ساخت «شی» (Object) است. زبان‌های برنامه‌نویسی که از این رویکرد و در واقع پارادایم برنامه‌نویسی پشتیبانی می‌کنند را «شی‌گرا» (Object Oriented) و برنامه‌نویسی با این پارادایم را «برنامه‌نویسی شی‌گرا» (Object Oriented Programming) می‌گویند. یک شی، دو مشخصه دارد:



  • خصیصه

  • رفتار


مثالی که در ادامه می‌آید، در این راستا قابل توجه است. در اینجا، «طوطی» (Parrot) یک شی است.



  • نام (Name)، سن (Age) و رنگ (Color) مشخصه‌های شی طوطی آن هستند.

  • خواندن (Singing) و حرکات موزون (Dancing) رفتار شی طوطی محسوب می‌شوند.


مفهوم OOP در پایتون، بر ساخت کدهای قابل استفاده مجدد تمرکز دارد. این مفهوم با عنوان «DRY» (سرنامی برای عبارت Don’t Repeat Yourself) نیز  شناخته شده است و بدان معنا است که کاری که یک‌بار انجام شده را نباید مجدد تکرار کرد و در واقع، می‌توان از کدها استفاده مجدد کرد. استفاده مجدد از کدهای نوشته شده، یکی از مباحث مهم در بحث مهندسی نرم‌افزار است. در پایتون، مفهوم OOP از چند اصل پایه‌ای پیروی می‌کند که در ادامه شرح داده شده‌اند.



  • ارث‌بری (Inheritance): فرایند استفاده از جزئیات از کلاس جدید بدون ویرایش کلاس موجود را ارث‌بری گویند.

  • کپسوله‌سازی (Encapsulation): پنهان‌سازی جزئیات خصوصی یک کلاس از اشیای دیگر را کپسوله‌سازی گویند.

  • چندریختی (Polymorphism): مفهوم استفاده از عملیات متداول به روش‌های متفاوت برای ورودی‌های داده متفاوت را چندریختی یا پلی‌مورفیسم گویند.


کلاس


یک کلاس، یک «نقشه ساخت» (بلوپرینت | BluePrint) برای یک شی است. می‌توان به یک کلاس به عنوان پیش‌طرح (اسکیس | Sketch) از طوطی (Parrot) با برچسب‌های آن نگاه کرد. کلاس همه جزئیات درباره نام، رنگ‌ها، اندازه و دیگر موارد را دارد. بر اساس این توضیحات، می‌توان درباره طوطی مطالعه کرد. در اینجا، طوطی یک شی است. مثال کلاس طوطی (Parrot) به صورت زیر است:


 


:class Parrot
pass

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


شی


یک شی (نمونه)، یک نمونه از یک کلاس است. هنگامی که کلاس تعریف می‌شود، تنها توصیف شی تعریف می‌شود. بنابراین، هیچ حافظه یا فضای ذخیره‌سازی به آن تخصیص داده نمی‌شود. مثال، برای شی کلاس parrot، به صورت زیر است:


obj = Parrot()

در اینجا، obj شی کلاس Parrot است. فرض می‌شود که برنامه‌نویس جزئیاتی را پیرامون parrot دارد. اکنون، هدف آن است که نشان داده شود چگونه کلاس و شی‌های parrot ساخته می‌شوند.


مثال ۱: ساخت کلاس و شی در پایتون


 


:class Parrot

class attribute#
"species = "bird

instance attribute#
: def __init__(self, name, age)
self.name = name
self.age = age

instantiate the Parrot class#
blu = Parrot("Blu", 10)
woo = Parrot("Woo", 15)

access the class attributesv#
print("Blu is a {}".format(blu.__class__.species))
print("Woo is also a {}".format(woo.__class__.species))

access the instance attributes#
print("{} is {} years old".format( blu.name, blu.age))
print("{} is {} years old".format( woo.name, woo.age))

پس از اجرای برنامه بالا، خروجی به صورت زیر خواهد بود.


Blu is a bird
Woo is also a bird
Blu is 10 years old
Woo is 15 years old

 


در برنامه بالا، یک کلاس با نام Parrot ساخته می‌شود. سپس، خصیصه‌ها تعریف می‌شوند. خصیصه‌ها مشخصات یک شی هستند. سپس، نمونه‌های کلاس Parrot ساخته می‌شوند. در اینجا، blu و woo مراجعی (مقادیر) برای اشیای جدید هستند. سپس، با استفاده از class __.species__ به کلاس مشخصه می‌توان دسترسی داشت. خصیصه‌های کلاس برای همه نمونه‌های یک کلاس مشابه هستند. به طور مشابه، می‌توان به خصیصه‌های نمونه‌ها با استفاده از blu.name و blu.age دسترسی داشت. اگرچه، خصیصه‌های نمونه برای هر نمونه از کلاس متفاوت هستند.


متدها


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


مثال ۲: ساخت متدها در پایتون


:class Parrot

# instance attributes
:def __init__(self, name, age)
self.name = name
self.age = age

instance method#
:def sing(self, song)
return "{} sings {}".format(self.name, song)

: def dance(self)
return "{} is now dancing".format(self.name)

instantiate the object#
blu = Parrot("Blu", 10)

call our instance methods#
print(blu.sing("'Happy'"))
print(blu.dance())

هنگامی که برنامه اجرا می‌شود، خروجی به صورت زیر خواهد بود:


'Blu sings 'Happy
Blu is now dancing

در برنامه بالا، دو متد ()sing و ()dance تعریف شده‌اند. به این دو، متد نمونه (Instance Method) گفته می‌شود، زیرا روی یک شی نمونه فراخوانی می‌شوند، در مثال بالا، blu یک متد نمونه است.


ارث‌بری


ارث‌بری (Inheritance) راهکاری برای ساخت یک کلاس جدید برای استفاده از جزئیات موجود در یک کلاس بدون ویرایش آن است. کلاس جدیدی که شکل می‌گیرد، یک کلاس مشتق شده (یا کلاس فرزند) است. به طور مشابه، کلاس موجود، کلاس مبنا (کلاس والد) است.


مثال ۳: استفاده از ارث‌بری در پایتون


 


 parent class#
:class Bird

:def __init__(self)
print("Bird is ready")

:def whoisThis(self)
print("Bird")

:def swim(self)
print("Swim faster")

child class#
class Penguin(Bird):

:def __init__(self)
# call super() function
super().__init__()
print("Penguin is ready")

:def whoisThis(self)
print("Penguin")

: def run(self)
print("Run faster")

()peggy = Penguin
()peggy.whoisThis
()peggy.swim
()peggy.run

خروجی حاصل از اجرای برنامه بالا، به صورت زیر است.


Bird is ready
Penguin is ready
Penguin
Swim faster
Run faster

در برنامه بالا، دو کلاس، برای مثال Bird (کلاس والد) و Penguin (کلاس فرزند) ساخته شده است. کلاس فرزند از توابع کلاس والد ارث‌بری می‌کند. می‌توان این مورد را از متد ()swim دید. دوباره، کلاس فرزند، رفتار کلاس والد را ویرایش می‌کند. می‌توان این مورد را از متد ()whoisThis دید. علاوه بر آن، توابع کلاس فرزند با ساخت یک متد ()run جدید، توسعه پیدا می‌کنند. همچنین، از تابع ()super پیش از متد ()__init__ استفاده می‌شود. این بدین دلیل است که هدف، کشیدن (pull) محتوای متد ()__init__ از کلاس والد به کلاس فرزند است.

کپسوله‌سازی


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


مثال ۴: کپسوله‌سازی داده‌ها در پایتون


 


:class Computer

: def __init__(self)
self.__maxprice = 900

:def sell(self)
print("Selling Price: {}".format(self.__maxprice))

: def setMaxPrice(self, price)
self.__maxprice = price

()c = Computer
()c.sell

change the price#
c.__maxprice = 1000
()c.sell

using setter function#
c.setMaxPrice(1000)
()c.sell

پس از اجرای برنامه بالا، خروجی به صورت زیر خواهد بود.


Selling Price: 900
Selling Price: 900
Selling Price: 1000
در برنامه بالا، کلاس Computer تعریف شد. از متد ()__init__ برای ذخیره‌سازی حداکثر قیمت فروش یک کامپیوتر استفاده می‌شود. تلاش شده تا قیمت ویرایش شود. اگرچه، نمی‌توان آن را تغییر داد زیرا پایتون با maxprice__ به عنوان یک خصیصه خصوصی برخورد می‌کند. برای تغییر مقدار، از یک تابع تنظیم‌کننده (setter function) برای مثال ()setMaxPrice استفاده می‌شود که قیمت را به عنوان یک پارامتر دریافت می‌کند.

چندریختی


«چند ریختی» (Polymorphism)، یک توانایی (در برنامه‌نویسی شی‌گرا) برای استفاده از رابط متداول، به چندین شکل (نوع داده) است. فرض می‌شود که کاربر نیاز به رنگ کردن یک شکل دارد، چندین گزینه برای شکل وجود دارد (مستطیل، مربع و دایره). می‌توان از روش مشابهی برای رنگ کردن هر شکلی استفاده کرد. این مفهوم، چندریختی نام دارد.


مثال ۵: استفاده از چند ریختی در پایتون


:class Parrot

: def fly(self)
print("Parrot can fly")

:def swim(self)
print("Parrot can't swim")

:class Penguin

:def fly(self)
print("Penguin can't fly")

:def swim(self)
print("Penguin can swim")

common interface#
:def flying_test(bird)
()bird.fly

instantiate objects#
()blu = Parrot
()peggy = Penguin

passing the object#
flying_test(blu)
flying_test(peggy)

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


Parrot can fly
Penguin can't fly

در برنامه بالا، دو کلاس Parrot و Penguin تعریف شده‌اند. هر یک از این‌ها، دارای متد متداول ()fly هستند. اگرچه، توابع آن‌ها متفاوت هستند. برای پذیرش چندریختی، یک رابط مشترک ساخته شده است؛ در واقع، تابع ()flying_test که هر تابعی را می‌تواند بگیرد. سپس، اشیای blu و peggy به تابع ()flying_test انتقال داده می‌شوند. این تابع به شیوه موثری عمل می‌کند. نکات کلیدی که باید پیرامون برنامه‌نویسی شی‌گرا به خاطر داشت:



  • برنامه‌نویسی با استفاده از پارادایم شی‌گرا، آسان و موثر شده است.

  • کلاس، قابل به اشتراک‌گذاری است؛ بنابراین، کدها قابل استفاده مجدد می‌شوند.

  • کارایی برنامه‌نویس‌ها با بهره‌گیری از برنامه‌نویسی شی‌گرا، افزایش پیدا می‌کند.

  • داده‌ها با «انتزاعی‌سازی داده» (Data Abstraction)، امن و مطمئن خواهند بود.

نویسنده بلاگ: جواد یوسفی

جواد یوسفی

برنامه نویس فرانت اند

دیدگاه کاربران

    هیچ نظری ثبت نشده! اولین نفری باش که نظرشو ثبت میکنه!

ثبت دیدگاه

برای ثبت نظر، ابتدا وارد شوید.

خدمات منتورینگ

شما در طول دوره ی آنلاین میتوانید یک پشتیبان یا همراه داشته باشید و تمامی تمرین ها و مشکلات خودتون رو با اپراتور های ما در میان میگذارید! چی بهتر از اینکه قدم به قدم در کنار اساتید و آموزش های آنلاین بتونی از طریق پشتیبان هم ارزیابی بشی و مشکلاتت رو توی کمترین زمان ممکن حل کنی؟!!