وراثت

قبلا به صورت گذرا در مقاله های قبلی به وراثت اشاره کرده بودیم اما توی این مقاله می خواهیم این موضوع رو یه کم بیشتر باز کنیم.وراثت جزو معدود کلمات کامپیوتری به حساب میاد که معنیش دقیقا برابر با همون معنی انگلیسی اش است. یعنی وقتی می گوییم کلاس B از کلاس A ارث می برد، یعنی به طور اتوماتیک یه سری از خصوصیات A در کلاس B گنجانده میشود. مثل بچه ای که امکان دارد رنگ چشم یا موهایش را از خانواده اش به ارث ببرد. به مثال زیر توجه کنید:

 

نمونه ساده ای از وراثت

class A(object):

    	def sayHello(self):
        	print "Hello A!"

class B(A): 
	pass

b = B()
b.sayHello()

در مثال بالا A کلاسی است که یک متد تعریف شده به نام sayHello را در خود جای داده است. هنگام تعریف کلاس B ما مشخص کردیم کردیم که این کلاس باید از A ارث ببرد، پس به طور اتوماتیک متد sayHello که اصلا در B وجود خارجی ندارد، به کلاس B اضافه میشود.

اگر متدی با همین نام در کلاس B هم تعریف شده بود، دیگر متد sayHello که مربوط به کلاس A است اجرا نمیشد و از متد تعریف شده در کلاس B استفاده میشد. در یک همچین وضعیتی می گوییم متد sayHello ی موجود در کلاس B ، متد sayHello ی موجود در کلاس A را لغو کرده است. باید به این نکته توجه کنیم که چون خود A از شی اصلی object ارث برده است، پس تمام کلاس هایی که از آن ارث میبرند – مانند B – هم خود به خود در دسته ی کلاس های سبک جدید پایتون جای میگیرند.

استفاده از متد های لغو شده

همانطور که در بالا اشاره کردیم اگر کلاس B متدی از کلاس A را لغو کند، دیگر توانایی صدا کردن آن را از طریق کلاس B نخواهیم داشت چون به حالت عادی متدی که مال خود کلاس B است اجرا می گردد. اما در شرایطی خاص ممکن است نیاز به فراخانی متد لغو شده ی کلاس A باشد. برای این کار باید مانند مثال زیر عمل کنیم:

 

استفاده از متد های لغو شده

class A(Object):

    def sayHello(self):
        print "Hello A!"

class B(A):

    def sayHello(self):
        print "Hello B!"
        A.sayHello(self)

b = B()
b.sayHello()

همانطور که میبینید باید برای استفاده از متدهای لغو شده ی کلاس والد، مستقیما به خود آن کلاس اشاره کنیم و به عنوان اولین پارامتر آن متد، از ارجاع self استفاده نماییم.

نکته ای در رابطه با سازنده ها

در خیلی از زبان های برنامه نویسی شی گرا وقتی که کلاس فرضی B از کلاس فرضی A ارث میبرد، خود به خود متد سازنده ی کلاس A را اجرا میکند. اما در پایتون اگر برای کلاس A متد __init__ را تعریف کرده باشیم باید به صورت دستی آن را اجرا کنیم زیرا در غیر این صورت کلاس A مقدار دهی اولیه نمیشود. به مثال زیر توجه کنید:

 

نکته ای در باره سازنده ها

class A(object):
    def __init__(self):
        self.name = "amir"

class B(A):
    def __init__(self):
        A.__init__(self)

    def sayHello()
        print self.name

bb = ‌B()
bb.sayHello()

در این مثال به صراحت متد __init__ کلاس A را در متد __init__ کلاس B ذکر کردیم ولی شاید به نظر برسی که اگر آن را ذکر نمیکردیم دیگر متغیر name در کلاس A به وجود نمی آمد و کلاس B نمی توانست با استفاده از قابلیت های ارث بری آن را به کار گیرد ولی در متد __init__ کلاس B به طور خودکار متد __init__ کلاس پدر یعنی کلاس A صدا زده میشود.


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