نحوه استفاده از برنامه نویسی شی گرا در پایتون – با مثال توضیح داده شده است
برنامه نویسی شی گرا (OOP) سبکی از برنامه نویسی است که به شدت به اشیا متکی است. این اشیا می توانند ویژگی ها و متدهایی داشته باشند. در حالی که ویژگی ها داده ها را ذخیره می کنند، روش ها رفتار را تعریف می کنند.
مانند بسیاری از زبان های برنامه نویسی دیگر، پایتون هم از برنامه نویسی OOP و هم از برنامه نویسی تابعی پشتیبانی می کند. با این حال، OOP هنگام نوشتن برنامه های بزرگ و پیچیده ارزشمند می شود.
در این مقاله با مزایای OOP در پایتون، نحوه تعریف کلاس، ویژگی های کلاس و نمونه و متدهای نمونه آشنا خواهید شد. همچنین با مفهوم کپسوله سازی و نحوه پیاده سازی وراثت بین کلاس ها در پایتون آشنا خواهید شد.
برای درک کامل این مقاله، باید پیش نیازهای زیر را داشته باشید:
دانش اولیه زبان برنامه نویسی پایتون.
آشنایی با مفاهیم توابع و اشیا در برنامه نویسی.
تجربه کار با ویرایشگر کد یا محیط توسعه یکپارچه (IDE).
درک اولیه نحوه استفاده از ترمینال یا کنسول خط فرمان.
حالا بیایید شیرجه بزنیم.
چرا از برنامه نویسی شی گرا استفاده کنیم؟
برنامه نویسی شی گرا (OOP) مزایای متعددی را هنگام سازماندهی و مدیریت کد ارائه می دهد. با گروهبندی دادهها و توابع مرتبط در کلاسهای منطقی، OOP ساختار کد را ارتقا میدهد و تعمیر و نگهداری را ساده میکند، به ویژه زمانی که برنامهها در اندازه و پیچیدگی رشد میکنند. رویکرد ماژولار درک، اصلاح و استفاده مجدد از کد را آسانتر میکند و در نتیجه زمان توسعه را کاهش میدهد.
یکی دیگر از مزایای OOP توانایی آن در ارائه یک سبک برنامه نویسی واضح و مرتبط است که می تواند برای توسعه دهندگان مفیدتر باشد. استفاده از اشیا و روابط بین آنها مفاهیم دنیای واقعی را منعکس می کند. این امر استدلال در مورد کد و طراحی سیستم های پیچیده را آسان تر می کند.
در نهایت، مفاهیم OOP مانند کپسولهسازی و وراثت، با ترویج حفاظت از دادهها و قابلیت استفاده مجدد کد، به استحکام کد کمک میکنند.
کلاس در پایتون چیست؟
OOP در پایتون به شدت بر مفهوم class
متکی است. شما می توانید یک کلاس را به عنوان یک طرح اولیه در نظر بگیرید که برای ایجاد اشیا استفاده می شود. برای نشان دادن این موضوع، تصور کنید که طرحی برای یک بلندگو دارید. شما می توانید از این طرح برای ساخت چندین بلندگو استفاده کنید. هر بلندگوی که با استفاده از طرح اولیه ایجاد می شود، نمونه ای از طرح اولیه است. همچنین هر بلندگوی ایجاد شده دارای ویژگی هایی مانند رنگ، مدل و نام است. آنها همچنین روش های خود را نشان می دهند که نوع خاصی از رفتار مانند افزایش صدا و کاهش صدا را نشان می دهد.
نحوه تعریف کلاس در پایتون
برای تعریف یک کلاس، باید از کلمه کلیدی class
که توسط پایتون ارائه شده است، استفاده کنید، سپس نام کلاس و یک کولون را دنبال کنید:
class ClassName: pass
اکنون با استفاده از تصویر قبلی خود، بیایید کلاسی به نام Speaker
ایجاد کنیم. در ویرایشگر کد خود، یک فایل به نام classes.py
ایجاد کنید و خطوط کد زیر را در آن کپی کنید:
class Speaker: pass speaker_one = Speaker() print(speaker_one)
در کد قبلی، کلاسی به نام Speaker
را بدون هیچ ویژگی یا متد تعریف کردید. شما از کلمه کلیدی pass
در بدنه کلاس استفاده کردید. در پایتون، کلمه کلیدی pass
هیچ کاری انجام نمی دهد و معمولاً به عنوان مکان نگهدارنده استفاده می شود.
در خط چهار کد، نمونه ای از کلاس Speaker
ایجاد کردید و آن را به متغیر speaker_one
اختصاص دادید. این فرآیند به عنوان نمونه سازی یک شی از یک کلاس نیز شناخته می شود. سپس speaker_one
در خط پنج چاپ کردید.
اکنون کد را با اجرای دستور python classes.py
در ترمینال خود اجرا کنید. خروجی مشابه این را در ترمینال خود دریافت خواهید کرد:
<__main__.Speaker object at 0x10087f8e0>
خروجی نشان می دهد که speaker_one
یک شی است. 0x10087f8e0
در خروجی آدرس حافظه را نشان می دهد که پایتون شی را در رایانه شما ذخیره می کند.
آدرس حافظه در خروجی ترمینال شما متفاوت خواهد بود.
می توانید چندین نمونه دیگر از کلاس Speaker
ایجاد کنید و همه آنها با یکدیگر متفاوت خواهند بود. برای تأیید این موضوع، از عملگر مقایسه برابری ( == ) استفاده می کنیم. در فایل classes.py
خود، print(speaker_one)
حذف کنید و موارد زیر را به پایین کد خود اضافه کنید:
speaker_two = Speaker() if speaker_one == speaker_two: print("speaker one is the same as speaker two") else: print("speaker one is different from speaker two")
اکنون python classes.py
در ترمینال خود اجرا کنید. خروجی زیر را دریافت خواهید کرد:
speaker one is different from speaker two
صفات کلاس و نمونه
در این بخش، ویژگی هایی را به کلاس Speaker
خود اضافه می کنید. شما می توانید ویژگی ها را به عنوان داده های ذخیره شده در یک شی ببینید. در حالی که ویژگی های کلاس برای همه نمونه های ایجاد شده از کلاس شما مشترک است، ویژگی های نمونه برای هر نمونه منحصر به فرد هستند.
اکنون فایل classes.py
خود را با جایگزین کردن کد خود با کد زیر تغییر دهید:
class Speaker: brand = "Beatpill" # class attribute def __init__(self, color, model): self.color = color # instance attribute self.model = model # instance attribute
شما باید از قبل با خط یک کد جدید خود آشنا باشید. در خط دو، یک ویژگی کلاس را با نام brand
تعریف کردید و مقدار Beatpill
را به آن اختصاص دادید. آپشن های کلاس، متغیرهایی هستند که به خود کلاس تعلق دارند، نه به نمونههای جداگانه کلاس. تأثیر آپشن های کلاس این است که تمام نمونههایی که از کلاس خود ایجاد میکنید، ویژگی کلاس و مقدار آن را به ارث میبرند و به اشتراک میگذارند. در این حالت، هر نمونه ای که از کلاس Speaker
خود ایجاد می کنید، ارزش brand
یکسانی را به اشتراک می گذارد.
خط چهار کد شما یک متد __init__
را تعریف می کند که دارای سه پارامتر self
، color
و model
است. هر زمان که یک نمونه جدید از کلاس Speaker
خود ایجاد کنید، این متد فراخوانی می شود. پارامتر self
ارجاعی به کلاس Speaker
است و این یک قرارداد در پایتون است که همیشه آن را به عنوان اولین پارامتر در متد __init__
داشته باشیم. خط پنج و شش صفت نمونه، color
و model
در کلاس Speaker
خود بنویسید.
پس ، هر بار که یک نمونه جدید از کلاس خود ایجاد می کنید، باید آرگومان هایی برای ویژگی های color
و model
خود ارائه دهید. عدم انجام این کار منجر به خطا می شود.
حالا موارد زیر را به پایین کد خود اضافه کنید:
speaker_one = Speaker("black", "85XB5") speaker_two = Speaker("red", "Y8F33") print(f"speaker one is {speaker_one.color} while speaker two is {speaker_two.color}")
با گفت ن کد قبلی، دو نمونه از کلاس Speaker
ایجاد کردید - speaker_one
و speaker_two
. آرگومان ها در هر نمونه مقادیر color
و ویژگی های model
آنها را نشان می دهند. سپس پیامی را چاپ کردید که ویژگی رنگ هر شی را نشان می دهد. حالا اگر دستور python classes.py
را در ترمینال خود اجرا کنید، خروجی را دریافت خواهید کرد:
speaker one is black while speaker two is red
برای مشاهده اینکه هر دو نمونه ویژگی کلاس brand
یکسانی دارند، تابع print()
خود را به این صورت تغییر دهید:
print( f"speaker one is {speaker_one.color} while speaker two is {speaker_two.color}", speaker_one.brand, speaker_two.brand, sep="\n", )
حالا python classes.py
را اجرا کنید و خروجی زیر را دریافت خواهید کرد:
speaker one is black and speaker two is red Beatpill Beatpill
روش های نمونه
علاوه بر ویژگی های کلاس و نمونه، کلاس ها می توانند متدهایی نیز داشته باشند که به روش های نمونه معروف هستند. متدهای نمونه، توابعی هستند که در یک کلاس تعریف شده اند و روی نمونه هایی از کلاس عمل می کنند. آنها از ویژگی های کلاس و نمونه برای ارائه رفتار و عملکرد به اشیا استفاده می کنند.
برای گفت ن متدهای نمونه، فایل کد خود را به صورت زیر تغییر دهید:
class Speaker: brand = "Beatpill" def __init__(self, color, model): self.color = color self.model = model def power_on(self): print(f"Powering on {self.color} {self.model} speaker.") def power_off(self): print(f"Powering off {self.color} {self.model} speaker.") speaker_one = Speaker("black", "85XB5") speaker_two = Speaker("red", "Y8F33")
در مثال بالا، دو روش نمونه اضافه کردهایم power_on()
و power_off()
. این روش ها، درست مانند روش __init__
، self
به عنوان اولین آرگومان در نظر می گیرند.
متد power_on()
پیامی را چاپ می کند که نشان می دهد بلندگوی رنگ و مدل داده شده روشن است. به طور مشابه، متد power_off()
پیامی در مورد خاموش کردن بلندگو چاپ می کند.
برای فراخوانی این متدها، موارد زیر را به پایین فایل خود اضافه کنید:
speaker_one.power_on() speaker_two.power_off()
اکنون python classes.py
در ترمینال خود اجرا کنید و خروجی زیر را دریافت خواهید کرد:
Powering on black 85XB5 speaker. Powering off red Y8F33 speaker.
کپسوله سازی در پایتون
کپسولاسیون یکی از مفاهیم اصلی OOP است. به مجموعه داده ها (ویژگی ها) و روش ها در یک کلاس اشاره دارد. کپسوله سازی حفاظت از داده ها و کنترل نحوه تعامل کد با وضعیت داخلی یک شی را فراهم می کند.
میتوانید با تعریف ویژگیها و متدهای خصوصی در یک کلاس، به کپسولهسازی در پایتون برسید. طبق قرارداد، ویژگی ها و روش های خصوصی با یک زیرخط (_) پیشوند می شوند. در حالی که پایتون مانند برخی از زبانهای دیگر اصلاحکنندههای خصوصی سختگیرانه ندارد، پیشوند زیر خط به عنوان هشداری برای توسعهدهندگان دیگر عمل میکند تا به ویژگیها و متدها مستقیماً از خارج کلاس دسترسی نداشته باشند یا آنها را اصلاح نکنند.
در اینجا نمونه ای از کپسوله سازی در پایتون آورده شده است:
class Speaker: brand = "Beatpill" def __init__(self, color, model): self._color = color # Private attribute self._model = model # Private attribute def power_on(self): print(f"Powering on {self._color} {self._model} speaker.") def power_off(self): print(f"Powering off {self._color} {self._model} speaker.") def get_color(self): return self._color def set_color(self, new_color): self._color = new_color speaker_one = Speaker("black", "85XB5") speaker_one.power_on() # Accessing a private attribute directly (not recommended) print(speaker_one._color) # Accessing a private attribute using the getter method (recommended) print(speaker_one.get_color()) # Modifying a private attribute using the setter method (recommended) speaker_one.set_color("white") print(speaker_one.get_color())
در مثال قبل، ویژگی های color
و model
، ویژگی های خصوصی کلاس Speaker
هستند. اگرچه می توان مستقیماً از خارج از کلاس با استفاده از print(speaker_one._color)
این ویژگی ها دسترسی پیدا کرد و آنها را تغییر داد، اما این عمل توصیه نمی شود. انجام این کار کپسوله سازی را نقض می کند و می تواند منجر به رفتار ناخواسته یا تخریب داده شود.
در عوض، کلاس متدهای get_color()
و setter set_color()
را برای دسترسی و اصلاح ویژگی های خصوصی به صورت کنترل شده ارائه می کند. این روشها بهعنوان رابطی برای تعامل با وضعیت داخلی شی عمل میکنند، از یکپارچگی دادهها اطمینان میدهند و اعتبارسنجی اضافی را امکانپذیر میکنند.
کپسوله سازی ماژولار بودن کد، قابلیت نگهداری و حفاظت از داده ها را با جداسازی حالت داخلی از رابط عمومی (روش ها) ارتقا می دهد. این به شما امکان می دهد تا زمانی که رابط عمومی ثابت باقی می ماند، وضعیت داخلی را بدون تأثیر بر کدی که از کلاس استفاده می کند، تغییر دهید.
وراثت در پایتون
وراثت یکی دیگر از مفاهیم اصلی OOP است. این به کلاس ها اجازه می دهد تا ویژگی ها و متدها را از کلاس های دیگر به ارث ببرند. کلاس جدید ویژگی ها و متدهایی را از کلاس موجود به ارث می برد که به عنوان کلاس والد یا پایه شناخته می شود. کلاس جدید را کلاس فرزند یا مشتق می گویند.
وراثت با اجازه دادن به کلاس فرزند برای ارث بردن و گسترش عملکرد کلاس والد، استفاده مجدد از کد را ترویج می کند. این به ایجاد روابط سلسله مراتبی بین کلاس ها و سازماندهی کد به شیوه ای ساختارمندتر و منطقی کمک می کند.
در پایتون، وراثت با استفاده از سینتکس زیر پیاده سازی می شود:
class DerivedClass(BaseClass): # Derived class methods and attributes
برای مشاهده نحوه عملکرد وراثت، کد خود را به صورت زیر تغییر دهید:
class Speaker: brand = "Beatpill" def __init__(self, color, model): self._color = color self._model = model def power_on(self): print(f"Powering on {self._color} {self._model} speaker.") def power_off(self): print(f"Powering off {self._color} {self._model} speaker.") # Add a SmartSpeaker class and make it inherit from the Speaker class class SmartSpeaker(Speaker): def __init__(self, color, model, voice_assistant): super().__init__(color, model) self._voice_assistant = voice_assistant def say_hello(self): print(f"Hello, I am {self._voice_assistant}") # Create an instance of the SmartSpeaker class smart_speaker = SmartSpeaker("black", "XYZ123", "Alexa") smart_speaker.power_on() # Inherited from Speaker smart_speaker.say_hello()
در کد قبلی، کلاس SmartSpeaker
از کلاس Speaker
مشتق شده است. کلاس SmartSpeaker
ویژگی ها و متدهای کلاس Speaker
را به ارث می برد.
متد __init__
کلاس SmartSpeaker
متد __init__
کلاس Speaker
را با استفاده از super().__init__(color, model)
فراخوانی می کند. این تضمین می کند که ویژگی های _color
و _model
به ارث رسیده به درستی مقداردهی اولیه شده اند. همچنین، کلاس SmartSpeaker
دارای ویژگی _voice_assistant
و یک روش جدید say_hello
.
اکنون python classes.py
در ترمینال خود اجرا کنید و خروجی زیر را دریافت خواهید کرد:
Powering on black XYZ123 speaker. Hello, I am Alexa
نتیجه
در طول این مقاله، مزایای برنامه نویسی شی گرا (OOP) را برجسته کردیم و نحوه تعریف کلاس ها، ایجاد و استفاده از ویژگی ها و متدهای نمونه را نشان دادیم. مثالهای عملی برای نشان دادن اجرای کلاسها در پایتون و همچنین مفاهیم کلیدی OOP مانند کپسولهسازی و وراثت ارائه کردیم.
استفاده از درس های ارائه شده در این مقاله به شما کمک می کند تا تجربه برنامه نویسی پایتون خود را بهبود بخشیده و کارایی و قابلیت نگهداری کد خود را افزایش دهید.
مراجع و مطالعه بیشتر
https://en.wikipedia.org/wiki/Object-oriented_programming
https://realpython.com/python3-object-oriented-programming/
https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object-oriented_programming
https://docs.python.org/3/tutorial/classes.html
https://realpython.com/python-classes/
https://realpython.com/python-double-underscore/
ارسال نظر