Operator Overloading
1+4 دى إستخدام ال+Operator وهو إن يجمع عددين
1*2 إستخدام ال Operator * هنا إنه يضرب عددين
1-2 إستخدام ال – Operator هنا إنه يطرح عددين ولكن !
هل ينفع يكون ل Operator اكثر من إستخدام ؟
اها مثلا + Operator بيستخدم فى عمل دمج بين ال Strings
>>> s1='Hello, '
>>> s2='World!'
>>> s=s1+s2
>>> s
'Hello, World!'
يعنى إستخدمنا ال + Operator فى وظيفة اخرى غير الجمع وهى الدمج دى بإختصار هى ال Overloading Operators .. يعنى يكون ل Operator اكثر من إستخدام.
فى Special Methods او بتسمى احيانا بال Magical Methods هى اللى بتوفرلنا موضوع ال
Operator Overloading دا + بعض الأشياء الأخرى
__add__ للجمع
__sub__ للطرح
__mul__ للضرب وهكذا
فلنفترض إن عندى class وليكن Worker مثلا
class Worker(object):
def __init__(self, name, work_hours):
self.name=name
self.work_hours=work_hours
وانت عايز تعمل زيادة لساعات العمل work_hours او نقصان او مضاعفة ؟!
فى عدة حلول زى إنك تعمل 3 Methods كالتالى مثلا
def increment_workinghours(self, hours):
self.work_hours += hours
return self.work_hours
def decrement_workinghours(self, hours):
self.work_hours -= hours
return self.work_hours
def mul_workinghours(self, hours):
self.work_hours *= hours
return self.work_hours
حل آخر : هو إنك تعمل Overload لل Operators ال + و – و * كالتالى
def __add__(self, hours):
self.work_hours += hours
return self.work_hours
def __sub__(self, hours):
self.work_hours -= hours
return self.work_hours
def __mul__(self, hours):
self.work_hours *=hours
return self.work_hours
هيكون صورة الكلاس كالتالى
class Worker(object):
def __init__(self, name, work_hours):
self.name=name
self.work_hours=work_hours
def increment_workinghours(self, hours):
self.work_hours += hours
return self.work_hours
def decrement_workinghours(self, hours):
self.work_hours -= hours
return self.work_hours
def mul_workinghours(self, hours):
self.work_hours *= hours
return self.work_hours
def __add__(self, hours):
self.work_hours += hours
return self.work_hours
def __sub__(self, hours):
self.work_hours -= hours
return self.work_hours
def __mul__(self, hours):
self.work_hours *=hours
return self.work_hours
اعمل Object من ال Class وليكن w
>>> w=Worker('EVAN', 4)
>>> w.increment_workinghours(3)
7
>>> w.decrement_workinghours(2)
5
>>> w.mul_workinghours(2)
10
انا شايف إن الإسلوب دا ممل جدا مع إنه احيانا بيكون اءمن بعض الشئ ولكنه ممل!
اعمل Object تانى وليكن w1
>>> w1=Worker('ANN', 5)
>>> w1+2
7
>>> w1-4
3
>>> w1*5
15
جدول بكل المعاملات + الMagic Methods الخاصة بيهم لتعريفهم
+ __add__, __radd__
- __sub__, __rsub__
* __mul__, __rmul__
/ __div__, __rdiv__, __truediv__ (for Python 2.2),
__rtruediv__ (for Python 2.2)
// __floordiv__, __rfloordiv__ (for Python version 2.2)
% __mod__, __rmod__
** __pow__, __rpow__
<< __lshift__, __rlshift__
>> __rshift__, __rrshift__
& __and__, __rand__
^ __xor__, __rxor__
| __or__, __ror__
+= __iadd__
-= __isub__
*= __imul__
/= __idiv__, __itruediv__ (for Python version 2.2)
//= __ifloordiv__ (for Python version 2.2)
%= __imod__
**= __ipow__
<<= __ilshift__
>>= __irshift__
&= __iand__
^= __ixor__
|= __ior__
== __eq__
!+, <> __ne__
> __gt__
< __lt__
>= __ge__
<= __le__