سربارگذاری عملگر

بارگذاری عملگرها در پایتون این توان را به کاربر می دهد که تعیین کند انواع جدید با عملگرهای موجود چگونه استفاده شوند. عملگرهای قابل بارگذاری در پایتون از قرار زیرهستند:

+	 - 	* 	** 	/ 	// 	% 	<<
>> 	&	 |	 ^	 ~ 	<	 > 	<=
>= 	== 	!= 	+= 	-= 	*= 	**= 	/=
//= 	%= 	<<= 	>>= 	&= 	^= 	|= 	[]
() 	. 	‘‘ 	in


البته باید توجه داشت که در عمل بارگذاری نمی توان خواص عملگرها مانند اولویت ها ، دودویی یا یکانی، شرکت پذیری و ... را تغییر داد، یا به خلق عملگر جدیدی پرداخت ؛ برخی عملگرها دونوع دودویی و یکانی دارند که هر کدام بطور جداگانه تعریف خواهند شد. به ازای هر عملگر در کلاس شئ یک یا چند متد ویژه وجود دارد، زیرا بارگذاری عملگرها از جمله خواصی است که زندگی در پایتون داشتن آنها را ایجاب می کند. که در زیر آنها را می بینید: عملگرهای دودویی(binary ) :

+	 __add__, __radd__
- 	__sub__, __rsub__
* 	__mul__, __rmul__
/ 	__div__, __rdiv__, __truediv__, __rtruediv__ 
// 	__floordiv__, __rfloordiv__
% 	__mod__, __rmod__
** 	__pow__, __rpow__
<< 	__lshift__, __rlshift__
>> 	__rshift__, __rrshift__
& 	__and__, __rand__
^ 	__xor__, __rxor__
| 	__or__, __ror__
+= 	__iadd__
-= 	__isub__
*= 	__imul__
/= 	__idiv__, __itruediv__ 
//= 	__ifloordiv__ 
%= 	__imod__
**= 	__ipow__
<<= 	__ilshift__
>>= 	__irshift__
&= 	__iand__
^= 	__ixor__
|= 	__ior__
== 	__eq__
!+, <> 	__ne__
> 	__gt__
< 	__lt__
>= 	__ge__
<= 	__le__

در لیست فوق اسامی در سه حالت به چشم می خورند، با پیشوندr ،i و بدون پیشوند. متدهای بدون پیشوند برای حالت عادی عمل که دو شئ از یک نوع با هم وارد عمل می شوند تعریف می شود یعنی برای عبارت a+b که از یک نوعند متد a.__add__(b)صدا زده می شود.

پیشوندr برای حالتی است که در عبارت a+b ، a از نوع b نباشد. در این موقع چون b شئ جدید است و a نوع b را نمی شناسد بر خلاف معمول عملوند سمت راست عبارت مسئول انجام عمل جمع است.برای همین هم از پیشوند r استفاده می شود.

پیشوند i برای اعمال فوری (in-place) است . یعنی وقتی داریم a+=b متد همه اعمال لازم را بروی اشیاء درگیر در عمل انجام داده و مقدار جواب نهایی را برمی گرداند.در مورد این مقوله در آینده توضیح خواهم داد.

برای بارگذاری اپراتورهای دودویی متد ویژه آنرا با امضای زیر در کلاس شئ مورد نظر تعریف خواهیم کرد:

def __methodName__(self, other): 

عملگرهاي يكاني موجود که قابل بار گذاری می باشند به شرح زیر هستند:

~,  __invert__
-,   __neg__
+,  __pos__

عملگرهای یکانی اینگونه تعریف می شوند:

def __methodName__(self):

مثال

خوب طبق معمول اما کمی دیرتر به یک مثال می پردازیم : بازهم نقطه هندسی!

class point:
    """ A geometric 2Dimensional point """

    def __init__(self, Xvalue = 0, Yvalue = 0):
        
        self.x = float(Xvalue)
        self.y = float(Yvalue)
    #adding conversion to type string (partially for printing the point)
    def __str__(self):
        print "converting point to string"
        return '(%s, %s)'% \
               (str(self.x), str(self.y))
    #adding binary '+' operator
    def __add__(self, other):
        print "adding two points"
        return point(self.x + other.x , self.y + other.y )
    #adding unary '+' operator
    def __pos__(self):
        print "making point positive"
        return point (abs(self.x), abs(self.y))
    #adding unary invert operator
    def __invert__(self):
        print "inverting a point"
        return point(self.y, self.x)
  
  #adding in-place addition ability
  def __iadd__(self, other):
        return point(self.x + other.x, self.y + other.y)

و مشاهده چگونگی عملکرد آنها:

>>> p1 = point(-1,-1)
>>> p2 = point(3,4)
>>> print (+p1) + ~p2
making point positive
inverting a point
adding two points
converting point to string
(5.0, 4.0)
>>> p1 += p2
>>> print p1
converting point to string
(2.0, 3.0)


صفحه قبلی: پایتون
صفحه بعدی: PyGTK