یکی از ویژگیهای جالب و قدرتمند زبان برنامهنویسی پایتون، توانایی سربارگذاری (Overloading) عملگرها است. این ویژگی به برنامهنویسان این امکان را میدهد که عملگرهای معمولی مانند +
، -
، *
و … را برای انواع دادههای خود تعریف کرده و رفتار آنها را تغییر دهند. در این مقاله، با مفهوم سربارگذاری عملگرها در پایتون آشنا میشویم و نحوه استفاده از آن را در برنامهنویسی با این زبان مطالعه خواهیم کرد. پیشنهاد میکنیم در ادامه از دیگر آموزشهای ما نیز دیدن فرمایید:
- لیست و نحوه کار با آن
- دیکشنری در پایتون
- Tuple در پایتون
- if در پایتون
- حلقه for
- حلقه while
- تابع در پایتون
- تبدیل نوع داده
مفهوم Overloading عملگرها
سربارگذاری عملگرها به معنای تعریف مجدد عملگرهای معمولی در زبانهای برنامهنویسی است. با این کار، میتوانید عملگرهایی که در اصل برای نوعهای داده خاصی تعریف شدهاند، برای نوعهای دادهای دلخواه خود تعریف کنید. به عبارت دیگر، میتوانید رفتار یک عملگر را برای انواع مختلف دادهها مشخص کنید.
به عنوان مثال، در بسیاری از زبانها، عملگر +
برای جمع دو عدد عمل میکند. اما در پایتون، شما میتوانید عملگر +
را برای انجام عملیاتهای دلخواهی مانند جمع دو عدد صحیح، اتصال دو رشته، یا حتی جمع دو ماتریس تعریف کنید.
سربارگذاری عملگر جمع (+) در پایتون
برای تعریف سربارگذاری عملگرها در پایتون، شما باید از متدهای خاص (Special Methods) که با دو خط تیره از هر دو طرف نام آنها مشخص میشوند، استفاده کنید. برای مثال، برای سربارگذاری عملگر جمع +
برای یک کلاس خاص، باید متد __add__
را در آن کلاس تعریف کنید.
class MyClass:
def __init__(self, value):
self.value = value
def __add__(self, other):
result = self.value + other.value
return MyClass(result)
# ایجاد دو نمونه از کلاس MyClass
obj1 = MyClass(10)
obj2 = MyClass(20)
# استفاده از اورلود عملگر جمع برای این دو نمونه
result = obj1 + obj2
print(result.value) # خروجی: 30
در این مثال، متد __add__
در کلاس MyClass
تعریف شده است. این متد دو مقدار را به عنوان پارامتر دریافت میکند (خود کلاس و مقدار دیگر) و عمل جمع را انجام میدهد. در خروجی نمونهای جدید از کلاس MyClass
را ایجاد و باز میگرداند.
حالا میتوانیم این سربارگذاری شده به عنوان عملگر جمع برای دو نمونه از کلاس MyClass
استفاده کنیم و نتیجه را در متغیر result
ذخیره کرده و چاپ کنیم.
سربارگذاری عملگرهای دیگر
علاوه بر عملگر جمع +
، در پایتون میتوانید عملگرهای دیگری مانند *
، -
، /
، ==
و … را نیز برای کلاسهای خود سربارگذاری کنید. برای هر عملگر، متد مخصوصی وجود دارد که باید در کلاسهای خود تعریف کنید. به عنوان مثال:
- برای عملگر ضرب
*
، متد__mul__
را تعریف کنید. - برای عملگر تفریق
-
، متد__sub__
را تعریف کنید. - برای عملگر تقسیم
/
، متد__truediv__
را تعریف کنید. - برای عملگر برابری
==
، متد__eq__
را تعریف کنید.
class MyClass:
def __init__(self, value):
self.value = value
def __add__(self, other):
result = self.value + other.value
return MyClass(result)
def __mul__(self, other):
result = self.value * other.value
return MyClass(result)
# ایجاد دو نمونه از کلاس MyClass
obj1 = MyClass(5)
obj2 = MyClass(3)
# استفاده از اورلود عملگر جمع و ضرب برای این دو نمونه
result1 = obj1 + obj2
result2 = obj1 * obj2
print(result1.value) # خروجی: 8
print(result2.value) # خروجی: 15
سربارگذاری عملگرها در انواع دادهای دلخواه
یکی از قدرتهای بزرگ پایتون در مورد سربارگذاری عملگرها این است که شما میتوانید این سربارگذاری را برای انواع دادهای دلخواه خود تعریف کنید.با این قابلیت توسعه دهندگان میتوانند عملگرهای سفارشی را برای کلاسهای خود ایجاد کنند و رفتار منطقی برای آنها تعریف کنند.
class ComplexNumber:
def __init__(self, real, imag):
self.real = real
self.imag = imag
def __add__(self, other):
real_result = self.real + other.real
imag_result = self.imag + other.imag
return ComplexNumber(real_result, imag_result)
def __sub__(self, other):
real_result = self.real - other.real
imag_result = self.imag - other.imag
return ComplexNumber(real_result, imag_result)
def __str__(self):
return f"{self.real} + {self.imag}i"
# ایجاد دو نمونه از کلاس ComplexNumber
num1 = ComplexNumber(3, 2)
num2 = ComplexNumber(1, 7)
# استفاده از اورلود عملگرهای جمع و تفریق برای این دو نمونه
result_add = num1 + num2
result_sub = num1 - num2
print(result_add) # خروجی: "4 + 9i"
print(result_sub) # خروجی: "2 - 5i"
در این مثال، یک کلاس به نام ComplexNumber
برای مدلسازی اعداد مختلط تعریف شده است. سربارگذاری عملگرهای +
و -
برای انجام عملیاتهای جمع و تفریق دو عدد مختلط تعریف گردیده است. همچنین، متد __str__
برای نمایش مقادیر عدد مختلط به شکل معمولی ارائه گردیده است.
نکات مهم در استفاده از Overloading عملگرها
- در استفاده از سربارگذاری عملگرها، باید توجه داشته باشید که عملگرهای اصلی برای نوعهای دادهای استاندارد (string، integer و …) به صورت پیشفرض وجود دارند. بنابراین، برای انواع دادهای جدیدی که تعریف میکنید، از نام عملگرها و متدهای مخصوص استفاده کنید تا کاربران نیازی به یادگیری عملگرهای جدید نداشته باشند.
- در سربارگذاری عملگرها، ممکن است نیاز به بررسی و اعتبارسنجی پارامترها داشته باشید تا از نوع و مقدار صحیح آنها مطمئن شوید.
- سربارگذاری عملگرها به شما این امکان را میدهند که رفتار منطقی برای کلاسهای خود تعریف کنید.
- سربارگذاری عملگرها باید به شکل معقولی تعریف شوند تا کاربران بتوانند از آنها به راحتی استفاده کنند و رفتار ناخواسته را جلوگیری کنید