Programming Freaks  | دورات ومقالات برمجيه

Please login or register.

Login with username, password and session length
Advanced search  

News:

Please Read our FAQ

Author Topic: Operator Overloading التحميل الزائد  (Read 1256 times)

Striky

  • Helping Freak
  • Administrator
  • Posting Freak
  • *****
  • Posts: 252
    • View Profile
    • WWW
    • Email
Operator Overloading التحميل الزائد
« on: October 26, 2008, 03:38:31 AM »

Operator Overloading



1+4 دى إستخدام ال+Operator  وهو إن يجمع عددين
1*2 إستخدام ال Operator * هنا إنه يضرب عددين
1-2 إستخدام ال – Operator هنا إنه يطرح عددين ولكن !

هل ينفع يكون ل Operator اكثر من إستخدام ؟
اها مثلا + Operator بيستخدم فى عمل دمج بين ال Strings

Code: [Select]
>>> s1='Hello, '
>>> s2='World!'
>>> s=s1+s2
>>> s
'Hello, World!'

Code: [Select]

يعنى إستخدمنا ال + Operator فى وظيفة اخرى غير الجمع وهى الدمج دى بإختصار هى ال Overloading Operators .. يعنى يكون ل Operator اكثر من إستخدام.

فى Special Methods او بتسمى احيانا بال Magical Methods هى اللى بتوفرلنا موضوع ال
Operator Overloading دا + بعض الأشياء الأخرى
__add__ للجمع
__sub__ للطرح
__mul__ للضرب وهكذا

فلنفترض إن عندى class وليكن Worker مثلا

Code: [Select]
class Worker(object):

    def __init__(self, name, work_hours):
        self.name=name
        self.work_hours=work_hours



وانت عايز تعمل زيادة لساعات العمل work_hours او نقصان او مضاعفة ؟!
فى عدة حلول زى إنك تعمل 3 Methods كالتالى مثلا
Code: [Select]
    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 ال + و – و * كالتالى
Code: [Select]
    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


هيكون صورة الكلاس كالتالى

Code: [Select]
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

Code: [Select]
>>> w=Worker('EVAN', 4)
>>> w.increment_workinghours(3)
7
>>> w.decrement_workinghours(2)
5
>>> w.mul_workinghours(2)
10

انا شايف إن الإسلوب دا ممل جدا مع إنه احيانا بيكون اءمن بعض الشئ ولكنه ممل!

اعمل Object تانى وليكن w1

Code: [Select]
>>> w1=Worker('ANN', 5)
>>> w1+2
7
>>> w1-4
3
>>> w1*5
15



جدول بكل المعاملات + الMagic Methods الخاصة بيهم لتعريفهم
Code: [Select]
+ __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__


« Last Edit: September 08, 2009, 08:31:52 PM by Ahmed Youssef »
Logged

Life is just a chance to grow a soul. - A. Powell
Weblog: http://ahmedyoussef.wordpress.com/